[Database] 복합 인덱스

나른한 개발자·2026년 1월 22일

f-lab

목록 보기
40/44

복합 인덱스 (Composite Index)

복합 인덱스는 데이터베이스에서 여러 개의 컬럼(열)들을 조합하여 인덱스를 생성하는 것을 말한다. 단일 인덱스(Single Index)가 한 개의 컬럼에 대해 생성되는 것과는 달리, 복합 인덱스는 여러 개의 컬럼을 함께 사용하여 인덱스를 생성한다.

복합 인덱스의 장점

예를 들어, 고객 정보 데이터베이스에서 고객 이름과 주소를 검색하는 경우를 생각해보자. 만약 단일 인덱스로 이름과 주소를 모두 인덱싱한다면, 데이터베이스는 인덱스에서 해당되는 모든 레코드를 검색하고 필터링하는 데 많은 시간이 소요될 것이다.

하지만 복합 인덱스를 사용하면 고객 이름과 주소 열을 통합하여 하나의 인덱스로 만들 수 있다. 이렇게 하면 데이터베이스는 해당 인덱스를 사용하여 더 빠르게 필요한 레코드를 검색할 수 있게 된다.

이처럼 복합 인덱스를 사용하였을 때 검색속도를 더 높일 수 있으며 그 외에도 여러 장점을 갖고 있다.

복합 인덱스는 장점을 나열하면 다음과 같다.

  • 검색 속도 개선: 여러 개의 컬럼을 동시에 검색할 수 있기 때문에 검색 속도가 개선할 수 있다.
  • 데이터 정렬의 효율성: 인덱스를 생성할 때 여러 개의 컬럼을 함께 사용하면 정렬을 할 때 더 효율적으로 할 수 있다.
  • 인덱스의 용량 절감: 인덱스를 생성할 때 여러 개의 컬럼을 함께 사용하면 인덱스의 용량이 줄어든다.
  • 쿼리 최적화: 복합 인덱스는 여러 개의 컬럼을 함께 사용하기 때문에, 쿼리가 여러 개의 조건을 가지고 있을 때 최적화된 실행 계획을 수립할 수 있다.

복합인덱스 컬럼 선택

그렇다면 어떤 컬럼을 선택하는게 복합인덱스를 사용하기 좋을까?

  • where절에서 and 조건으로 자주 통합되어 사용되면서 각각의 분포도 보다 두 개 이상의 컬럼이 통합될 때 분포도가 좋아지는 컬럼들
  • 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들
  • order by에서 자주 사용되는 컬럼들
  • 하나 이상의 키 컬럼 조건으로 같은 테이블의 컬럼들이 자주 조회될 때

복합인덱스 사용시 주의점

복합인덱스를 사용할 땐 아래와 같은 주의점을 요구하게 된다.

컬럼 개수

복합 인덱스는 일반적으로 WHERE 절에 자주 사용되는 컬럼들로 구성되는데, 인덱스를 생성하는 컬럼의 개수가 많아질수록 인덱스의 성능은 떨어질 수 있다.

인덱스 생성 순서

복합 인덱스를 생성할 때는 인덱스 생성 순서도 고려해야 한다. 쿼리문 작성 시 복합 인덱스를 사용하고자 한다면 반드시 복합 인덱스의 컬럼 중 선행하는 컬럼부터 조건에 지정하여 사용하여야 한다. 주로 자주 이용되는 순서대로 복합 인덱스 컬럼의 순서 결정한다.

복합 인덱스의 생성 순서가 중요한 이유는 인덱스의 내부 구조때문이다. 복합 인덱스는 B-Tree 구조로 만들어지는데 첫 번째 컬럼을 기준으로 먼저 정렬하고, 같은 값들 내에서 두 번째 컬럼을 정렬하는 방식이다. INDEX(name, age, city) 인덱스가 있다면 아래와 같이 정렬된다.

name으로 먼저 정렬
 └─ 같은 name 내에서 age로 정렬
     └─ 같은 age 내에서 city로 정렬

인덱스는 왼쪽에서 오른쪽으로 순차적으로 정렬되어 있기 때문에, 선행 컬럼 없이 뒤쪽 컬럼만 조건으로 사용하면 인덱스를 효율적으로 탐색할 수 없다.

순서 결정 기준 다음과 같다.

  • 자주 사용되는 컬럼을 앞에 - WHERE 절에 자주 등장하는 컬럼
  • 선택도가 높은 컬럼을 앞에 - 중복 값이 적어 데이터를 잘 구분하는 컬럼
  • = 조건이 범위 조건보다 앞에 - 정확한 값 매칭이 범위 검색보다 효율적

복합인덱스 사용방법

복합 인덱스를 만들고 사용하는 방법은 데이터베이스 종류에 따라서 다소 차이가 있을 수 있지만, 일반적으로 따르는 절차는 비슷하다.

  1. 인덱스를 생성할 테이블과 컬럼을 선택

  2. 인덱스를 생성할 컬럼의 순서를 결정.
    -검색 조건에서 자주 사용되는 컬럼을 먼저 위치시키는 것이 좋다.

  3. 복합 인덱스를 생성(순서의 중요성을 설명하기위해 1,3,2순의 순서를 정했다.)

CREATE INDEX index_name ON table_name (column1, column3, column2)
  1. 필요한 기능에서 쿼리문의 사용
SELECT * FROM table_name WHERE column1 = 'value1'
SELECT * FROM table_name WHERE column1 = 'value1' AND column3 = 'value3'
SELECT * FROM table_name WHERE column1 = 'value1' AND column3 = 'value3' AND column2 = 'value2'
  • 복합인덱스를 설정하였지만 사용되지 않을 때의 예시
SELECT * FROM table_name WHERE column2 = 'value2'
SELECT * FROM table_name WHERE column2 = 'value2' AND column3 = 'value3'
SELECT * FROM table_name WHERE column3 = 'value3' AND column2 = 'value2'

이처럼 where 조건문을 나열할 때 복합 인덱스의 첫 번째 컬럼인 column1 = 'value1' 가 없다면 복합인덱스를 검색할 수 없게 되어 적용되지 않는다.

참고문서< 추천

복합인덱스는 두개 이상의 컬럼을 사용하여 인덱스를 구성하는 것을 말한다. 여러개의 컬럼을 동시에 검색할 수 있어서 검색 성능이 올라가며 단일 인덱스를 여러개 생성하는 것보다 인덱스 용량이 절감될 수 있다. 복합 인덱스를 효율적으로 사용하기 위해서는 인덱스를 만들 컬럼을 잘 선택해야한다. 주로 where절에서 and로 자주 통합이 되거나 다른 테이블과 조인의 연결고리로 자주 사용되는 컬럼들, order by 에서 자주 사용되는 컬럼들로 선택하면 좋다. 다만 컬럼수가 너무 많아지면 성능이 떨어지기 때문에 주의해야한다. 복합 인덱스는 컬럼 순서에 따라서 정렬이 되기 때문에 인덱스를 사용할 때도 where절에서 해당 순서를 지켜줘야 인덱스를 더 효율적으로 사용할 수 있다.

profile
Start fast to fail fast

0개의 댓글