공통 기준

복합 인덱스는 왼쪽 컬럼부터 효율이 결정됩니다.

앞 컬럼에서 먼저 많이 줄이고, 범위 조건이 시작되면 그 뒤 컬럼 활용도는 약해집니다. 정렬이 필요하면 같은 인덱스 뒤쪽에 이어 붙여 한 번에 끝내는 것이 핵심입니다.

= 조건 먼저 정확히 찾는 값이 앞에 와야 시작 범위가 작아집니다.
선택도 높은 컬럼 우선 같은 조건이면 더 많이 걸러지는 컬럼이 먼저입니다.
범위 조건은 마지막 범위 뒤 컬럼은 인덱스 효율이 빠르게 줄어듭니다.
정렬 컬럼까지 연결 필터와 정렬을 같은 인덱스로 끝내면 filesort를 줄입니다.
상황 권장 인덱스 왜 빠른가
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 없이 읽는 순서만으로 결과를 반환할 수 있습니다.
한 줄 기억: 복합 인덱스는 앞 컬럼에서 얼마나 빨리 줄이느냐, 그리고 뒤 컬럼으로 범위·정렬을 얼마나 자연스럽게 이어가느냐로 성능이 갈립니다.