복합 인덱스(Composite Index)는 무엇일까

sobaman·2025년 2월 21일

DB & SQL

목록 보기
6/7

사전에 읽고 오면 좋은 글 - 인덱스란?

복합 인덱스는 두 개 이상의 컬럼을 결합하여 생성한 인덱스이다

여러 컬럼을 조합하여 특정 쿼리의 성능을 최적화하는 데 사용할 수 있다

간혹 결합 인덱스로도 불리는데 이 글에선 복합 인덱스로 정의하여 설명하겠다

예를 들어 (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_datecustomer_idstatus 방향으로 검색이 되어야 한다

// 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;
  1. order_date 만 검색 = OK
  2. order_datecustomer_id 검색 = OK
  3. customer_idstatus 검색 = NO
  4. customer_id 만 검색 = NO

조건을 지키지 않았을 경우 인덱스가 적용되지 않아 오히려 더 비효율적인 검색이 진행될 수 있다

복합 인덱스 설정 시 고려할 점


따라서 복합 인덱스는 인덱스의 순서를 설정하는 것이 굉장히 중요한데

이를 사용할 때 고려할 점은 다음과 같다

조회 패턴을 분석하여 Where 절에 자주 사용하는 칼럼을 맨 앞에 배치

  • 단독으로 자주 사용 가능하단 뜻이므로 선두 칼럼이 중요

equals() 즉 “=” 로 사용되는 칼럼 우선

  • “=” 이 아니라 Like, Between 같은 연산자를 사용하면 인덱스를 타지 않는다
  • 정 사용해야 하면 Like, Between 를 사용하는 조건문은 맨 뒤로 빼놓자

자주 이용되는 순서대로 인덱스 컬럼 순서를 결정

  • 위에서 언급한대로 순서대로 검색하지 않으면 아예 인덱스를 타지 않게 되니 반드시 이 점을 고려하여 순서를 결정하자

OR 조건에서는 결합 인덱스를 피하자

  • B+Tree 인덱스는 OR 연산에서 하나의 인덱스만 사용할 수 있다 따라서 각기 다른 범위를 탐색해야 하므로 인덱스 탐색이 어렵다
  • OR 조건에 많이 사용된다면 차라리 개별 인덱스를 걸어주자
profile
백엔드 공부 정리 블로그

0개의 댓글