앞 컬럼에서 먼저 많이 줄이고, 범위 조건이 시작되면 그 뒤 컬럼 활용도는 약해집니다. 정렬이 필요하면 같은 인덱스 뒤쪽에 이어 붙여 한 번에 끝내는 것이 핵심입니다.
| 상황 | 권장 인덱스 | 왜 빠른가 |
|---|---|---|
|
1.등호 조건을 앞에 둔다
user_id = 100
order_date >= '2024-01-01'
|
(user_id, order_date) | 정확히 일치하는 user_id로 먼저 좁힌 뒤, 그 안에서 날짜 범위를 스캔합니다. (order_date, user_id)보다 시작 구간이 훨씬 작습니다. |
|
2.같은 조건이면 더 잘 갈리는 컬럼
department_id = 10
status = 'ACTIVE'
|
(department_id, status) | department_id 100개 vs status 5개처럼 선택도가 더 높은 컬럼을 앞에 두면 첫 단계에서 대부분 걸러집니다. |
|
3.범위 조건은 마지막에 둔다
status = 'A'
created_at BETWEEN ...
|
(status, created_at) | 범위 스캔이 시작되는 순간 그 뒤 컬럼 활용도가 크게 떨어집니다. 그래서 범위 조건은 인덱스의 마지막 축에 두는 편이 안전합니다. |
|
4.ORDER BY 컬럼까지 이어 붙인다
user_id = 100
ORDER BY created_at DESC
|
(user_id, created_at DESC) | 필터 뒤 정렬 순서까지 같은 인덱스로 맞추면 별도 filesort 없이 읽는 순서만으로 결과를 반환할 수 있습니다. |