복합 인덱스는 데이터베이스에서 여러 개의 컬럼(열)들을 조합하여 인덱스를 생성하는 것을 말한다. 단일 인덱스(Single Index)가 한 개의 컬럼에 대해 생성되는 것과는 달리, 복합 인덱스는 여러 개의 컬럼을 함께 사용하여 인덱스를 생성한다.
예를 들어, 고객 정보 데이터베이스에서 고객 이름과 주소를 검색하는 경우를 생각해보자. 만약 단일 인덱스로 이름과 주소를 모두 인덱싱한다면, 데이터베이스는 인덱스에서 해당되는 모든 레코드를 검색하고 필터링하는 데 많은 시간이 소요될 것이다.
하지만 복합 인덱스를 사용하면 고객 이름과 주소 열을 통합하여 하나의 인덱스로 만들 수 있다. 이렇게 하면 데이터베이스는 해당 인덱스를 사용하여 더 빠르게 필요한 레코드를 검색할 수 있게 된다.
이처럼 복합 인덱스를 사용하였을 때 검색속도를 더 높일 수 있으며 그 외에도 여러 장점을 갖고 있다.
복합 인덱스는 장점을 나열하면 다음과 같다.
그렇다면 어떤 컬럼을 선택하는게 복합인덱스를 사용하기 좋을까?
복합인덱스를 사용할 땐 아래와 같은 주의점을 요구하게 된다.
복합 인덱스는 일반적으로 WHERE 절에 자주 사용되는 컬럼들로 구성되는데, 인덱스를 생성하는 컬럼의 개수가 많아질수록 인덱스의 성능은 떨어질 수 있다.
복합 인덱스를 생성할 때는 인덱스 생성 순서도 고려해야 한다. 쿼리문 작성 시 복합 인덱스를 사용하고자 한다면 반드시 복합 인덱스의 컬럼 중 선행하는 컬럼부터 조건에 지정하여 사용하여야 한다. 주로 자주 이용되는 순서대로 복합 인덱스 컬럼의 순서 결정한다.
복합 인덱스의 생성 순서가 중요한 이유는 인덱스의 내부 구조때문이다. 복합 인덱스는 B-Tree 구조로 만들어지는데 첫 번째 컬럼을 기준으로 먼저 정렬하고, 같은 값들 내에서 두 번째 컬럼을 정렬하는 방식이다. INDEX(name, age, city) 인덱스가 있다면 아래와 같이 정렬된다.
name으로 먼저 정렬
└─ 같은 name 내에서 age로 정렬
└─ 같은 age 내에서 city로 정렬
인덱스는 왼쪽에서 오른쪽으로 순차적으로 정렬되어 있기 때문에, 선행 컬럼 없이 뒤쪽 컬럼만 조건으로 사용하면 인덱스를 효율적으로 탐색할 수 없다.
순서 결정 기준 다음과 같다.
복합 인덱스를 만들고 사용하는 방법은 데이터베이스 종류에 따라서 다소 차이가 있을 수 있지만, 일반적으로 따르는 절차는 비슷하다.
인덱스를 생성할 테이블과 컬럼을 선택
인덱스를 생성할 컬럼의 순서를 결정.
-검색 조건에서 자주 사용되는 컬럼을 먼저 위치시키는 것이 좋다.
복합 인덱스를 생성(순서의 중요성을 설명하기위해 1,3,2순의 순서를 정했다.)
CREATE INDEX index_name ON table_name (column1, column3, column2)
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절에서 해당 순서를 지켜줘야 인덱스를 더 효율적으로 사용할 수 있다.