복합 인덱스의 컬럼 순서는 단순히 카디널리티가 높은 컬럼부터 배치하는 것이 아니라, 실제 쿼리의 WHERE, 조인, 정렬과 그룹화 패턴을 기준으로 결정해야 합니다.

MySQL의 (a, b, c) 인덱스는 기본적으로 왼쪽부터 이어지는 (a), (a, b), (a, b, c) 조건에 사용할 수 있습니다. 이를 Leftmost Prefix 원칙이라고 합니다. a 없이 b나 (b, c)만 사용하는 쿼리에서는 일반적인 인덱스 탐색에 활용하기 어렵습니다.

보통 다음 순서로 검토합니다.

  1. 여러 쿼리에서 공통으로 사용되고 데이터 접근 범위를 결정하는 컬럼을 앞에 둡니다.
  2. 동등 조건인 = 또는 IN 컬럼을 범위 조건 컬럼보다 앞에 둡니다.
  3. 첫 범위 조건 이후 컬럼은 탐색 범위를 좁히는 데 제한적으로 사용될 수 있으므로 ORDER BY와 GROUP BY까지 고려합니다.
  4. 필요한 경우 SELECT 컬럼을 뒤에 추가해 커버링 인덱스로 만들되 인덱스 크기와 쓰기 비용을 확인합니다.

예를 들어 WHERE tenant_id = ? AND status = ? AND created_at >= ? ORDER BY created_at 쿼리가 핵심이라면 (tenant_id, status, created_at)을 우선 검토할 수 있습니다. 최종 결정은 데이터 분포와 실제 실행 계획으로 검증해야 합니다.

출처 및 참고자료