인덱스(Index)란?

데이터베이스에서 표의 특정 열의 값으로부터 그 값을 가진 행의 위치를 재빨리 찾기 위한 자료 구조. 색인이라고도 한다. B+ 트리가 자주 사용된다. 검색은 빨라지지만, 행의 추가·갱신·삭제 때마다 유지 관리가 필요해지고 저장 용량도 사용한다.

일본어 명칭: インデックス

인덱스(Index)은(는) 데이터베이스 기초 등 1개 분야의 연습 문제 4개에 나와요.

분야: 데이터베이스 기초

B+ 트리 인덱스의 구조

관계형 데이터베이스의 인덱스에는 B+ 트리가 자주 사용됩니다. B+ 트리는 루트에서 리프까지의 단 수가 어디서나 같은, 가지가 많은 트리 구조로, 리프에 열의 값과 행의 위치를 값의 순서로 가지며 리프끼리는 순서대로 연결되어 있습니다. 노드 하나에서 100개로 갈라진다면 3단으로 100만 건을 구별할 수 있으므로, 100만 행의 표라도 몇 번의 읽기로 목적하는 행에 도달할 수 있습니다. 리프가 값의 순서로 연결되어 있으므로 =에 의한 검색뿐 아니라 BETWEEN 같은 범위 검색이나 ORDER BY 정렬에도 사용할 수 있습니다.

인덱스가 효과적인 경우와 그렇지 않은 경우

인덱스는 조건에 맞는 행이 전체의 극히 일부로 좁혀지는, 선택도가 높은 열에서 효과를 발휘합니다. 모든 값이 다른 회원번호 같은 열은 이상적이지만, 값이 2종류뿐인 성별 같은 열에서는 약 절반의 행이 해당하므로, 인덱스를 거쳐 한 행씩 꺼내는 것보다 표를 차례로 읽는 전체 스캔이 더 빠른 경우가 많아집니다. 또한 열에 함수를 적용한 조건이나 LIKE '%수' 같은 후방 일치 조건에서는 일반적인 인덱스를 사용할 수 없는 경우가 있습니다.

쓰기의 대가

인덱스는 표와는 별도로 유지 관리되는 자료 구조입니다. 행을 추가·갱신·삭제할 때마다 관련된 모든 인덱스도 갱신해야 하므로, 인덱스가 많을수록 쓰기는 느려지고 저장 용량도 늘어납니다. 그래서 자주 쓰는 검색 조건이나 조인 조건이 되는 열을 골라 인덱스를 만들고, 사용되지 않는 인덱스는 삭제하는 것이 기본입니다. 기본 키나 UNIQUE 제약의 열에는 많은 DBMS가 자동으로 인덱스를 만듭니다.

도전해 보기: 인덱스(Index) 관련 문제

100만 행이 있는 회원 표의 회원번호 열에 B+ 트리 인덱스를 만들었다. 일반적으로 기대할 수 있는 효과와 그 대가의 조합으로 올바른 것은?

  1. AWHERE 회원번호 = 12345 같은 검색이 빨라지는 한편, 행의 추가나 갱신 때마다 인덱스도 갱신하므로 쓰기는 느려진다
  2. B모든 열에서의 검색이 빨라지며, 대가는 없다
  3. C표의 행이 회원번호 순서로 정렬되므로 어떤 검색이든 빨라지는 한편, 저장 용량은 절반이 된다
정답과 해설 보기

정답: A. WHERE 회원번호 = 12345 같은 검색이 빨라지는 한편, 행의 추가나 갱신 때마다 인덱스도 갱신하므로 쓰기는 느려진다

인덱스(색인)는 표의 특정 열의 값으로부터 그 값을 가진 행의 위치를 재빨리 찾기 위한 자료 구조로, 관계형 데이터베이스에서는 B+ 트리가 자주 사용됩니다. 인덱스가 없으면 WHERE 회원번호 = 12345인 행을 찾는 데 100만 행을 차례로 조사(전체 스캔)해야 하지만, B+ 트리에서는 루트에서 리프까지 몇 단계만 따라가면 찾을 수 있습니다. 예를 들어 노드 하나에서 100개로 갈라진다면 100 × 100 × 100 = 100만이므로 약 3단계입니다. B+ 트리의 리프는 값의 순서로 연결되어 있으므로 BETWEEN 같은 범위 검색이나 ORDER BY 정렬에도 사용할 수 있습니다. 한편 행을 추가·갱신·삭제할 때마다 인덱스도 갱신해야 하므로 쓰기는 느려지고, 인덱스만큼의 저장 용량도 필요합니다. 인덱스를 만들지 않은 열에서의 검색은 빨라지지 않습니다.

100만 행의 회원 표에서 회원번호(모두 다름), 도도부현(47종류), 성별(2종류로 거의 반반) 열에 각각 B+ 트리 인덱스를 만드는 것을 생각한다. WHERE 절로 한 열의 값을 지정하여 검색할 때 인덱스의 효과가 가장 작다고 생각되는 열은?

  1. A도도부현
  2. B성별
  3. C회원번호
정답과 해설 보기

정답: B. 성별

인덱스가 효과를 발휘하는 것은 조건에 맞는 행이 전체의 극히 일부로 좁혀지는 경우입니다. 회원번호는 모두 다르므로 조건에 맞는 것은 한 행뿐이며, 인덱스로 바로 도달할 수 있습니다. 도도부현은 47종류이므로 균등하게 나뉘어 있다면 값 하나로 약 100만 ÷ 47 ≒ 2만 1천 행(전체의 약 2%)으로 좁혀집니다. 성별은 2종류로 거의 반반이므로 어느 값을 지정해도 약 50만 행(약 50%)이 해당합니다. 이렇게 많은 행을 인덱스를 거쳐 한 행씩 꺼내면 표를 처음부터 차례로 읽는 전체 스캔보다 느려지는 경우가 많으므로, DBMS의 옵티마이저는 인덱스를 사용하지 않는 실행 방법을 고르기도 합니다. 이처럼 값의 종류가 많고 조건으로 행을 좁힐 수 있는 정도(선택도)가 높은 열일수록 인덱스의 효과는 커집니다.

자주 묻는 질문

인덱스는 모든 열에 만드는 편이 좋나요?

좋지 않습니다. 인덱스가 많을수록 행을 추가하거나 갱신할 때마다 유지 관리 부담이 늘고 저장 용량도 사용합니다. 자주 검색이나 조인의 조건이 되고 행을 충분히 좁힐 수 있는 열을 골라 만듭니다.

인덱스를 만들었는데 사용되지 않는 이유는 무엇인가요?

조건에 맞는 행이 너무 많아 전체 스캔이 더 빠르다고 옵티마이저가 판단한 경우나, 열에 함수를 적용한 조건, 후방 일치 LIKE처럼 인덱스의 정렬 순서를 살릴 수 없는 조건인 경우 등을 생각할 수 있습니다.

해설 속 인덱스(Index)

인덱스(Index)이(가) 나오는 문제 (4)

  1. 100만 행이 있는 회원 표의 회원번호 열에 B+ 트리 인덱스를 만들었다. 일반적으로 기대할 수 있는 효과와 그 대가의 조합으로 올바른 것은?
  2. 100만 행의 회원 표에서 회원번호(모두 다름), 도도부현(47종류), 성별(2종류로 거의 반반) 열에 각각 B+ 트리 인덱스를 만드는 것을 생각한다. WHERE 절로 한 열의 값을 지정하여 검색할 때 인덱스의 효과가 가장 작다고 생각되는 열은?
  3. SQL 문은 데이터 정의어(DDL), 데이터 조작어(DML), 데이터 제어어(DCL)로 나뉜다. DDL로 분류되는 것은?
  4. 관계형 데이터베이스의 뷰에 대한 설명으로 올바른 것은?

관련 용어

관계형 데이터베이스(Relational Database) SQL 트랜잭션(Transaction) 뷰(View) 2단계 로킹(2PL) 격리 수준(Isolation Level) 기본 키(Primary Key) 외래 키(Foreign Key) 정규화(Normalization) 제3정규형(3NF)

용어집으로 돌아가기