복합 인덱스는 두 개 이상의 컬럼을 결합하여 생성한 인덱스이다
여러 컬럼을 조합하여 특정 쿼리의 성능을 최적화하는 데 사용할 수 있다
간혹 결합 인덱스로도 불리는데 이 글에선 복합 인덱스로 정의하여 설명하겠다
예를 들어 (A, B, C) 컬럼에 복합 인덱스를 생성하면
A, B, C 3개의 컬럼이 하나의 인덱스 구조로 저장된다
order_date / customer_id / status 3가지 컬럼에 복합 인덱스를 설정한다고 가정해보자
CREATE INDEX idx_order ON orders(order_date, customer_id, status);
복합 인덱스에는 단일 인덱스와 구분되는 아주 중요한 규칙이 있는데
바로 왼쪽에서부터 순서대로 검색해야 인덱스를 사용할 수 있다는 조건이 있다
즉 위의 예시를 기준으로 보면 order_date → customer_id → status 방향으로 검색이 되어야 한다
// 1 - OK
SELECT * FROM orders
WHERE order_date = '2024-01-01';
// 2 - OK
SELECT * FROM orders
WHERE order_date = '2024-01-01' AND customer_id = 1001;
// 3 - NO
SELECT * FROM orders
WHERE customer_id = 1001 AND status = "READY";
// 4 - NO
SELECT * FROM orders
WHERE customer_id = 1001;
order_date 만 검색 = OKorder_date → customer_id 검색 = OKcustomer_id → status 검색 = NOcustomer_id 만 검색 = NO조건을 지키지 않았을 경우 인덱스가 적용되지 않아 오히려 더 비효율적인 검색이 진행될 수 있다
따라서 복합 인덱스는 인덱스의 순서를 설정하는 것이 굉장히 중요한데
이를 사용할 때 고려할 점은 다음과 같다
조회 패턴을 분석하여 Where 절에 자주 사용하는 칼럼을 맨 앞에 배치
equals() 즉 “=” 로 사용되는 칼럼 우선
자주 이용되는 순서대로 인덱스 컬럼 순서를 결정
OR 조건에서는 결합 인덱스를 피하자