같은 쿼리
인덱스 순서만 바꿔도 스캔 범위가 달라집니다
SELECT * FROM orders WHERE status = 'COMPLETED' AND user_id = 100 AND order_date >= '2024-01-01';
읽는 순서 규칙
카디널리티 높은 등호
→
나머지 등호
→
범위 조건
범위 조건이 선두에 오면 그 뒤 컬럼은 인덱스에서 연속적으로 좁히기 어렵습니다.
비교 축
후보 1
사용 가능
(status, user_id, order_date)
후보 2
비효율
(order_date, status, user_id)
후보 3
최적
(user_id, status, order_date)
선두 탐색
status = 'COMPLETED'
→
user_id = 100
→
order_date ≥
order_date ≥
→
status = 'COMPLETED'
→
user_id = 100
user_id = 100
→
status = 'COMPLETED'
→
order_date ≥
핵심 차이
등호 조건 두 개를 먼저 소모한 뒤 범위로 들어가서 3개 컬럼을 모두 활용합니다.
범위 탐색이 먼저 시작되어 뒤의
status
,
user_id
조건은 인덱스 활용이 제한됩니다.
선택도가 높은 user_id
부터 압축해 시작하므로, 이후 등호와 범위를 가장 좁은 범위에서 처리합니다.
판정
3개 컬럼 활용
범위 이후 제한
활용 + 선택도 최상
정리
등호 조건 중 카디널리티 높은 컬럼
을 선두에 두고, 그다음 등호 조건을 배치한 뒤
범위 조건
을 마지막에 두는 순서가 가장 안정적으로 유리합니다.