InnoDB 인덱스는 B+tree입니다. 모든 리프가 같은 깊이에 있고 리프들이 연결되어 빠른 범위 스캔이 가능한 균형 트리죠. 조회는 O(log n)이며, 거대한 테이블에서도 페이지 읽기 몇 번이면 됩니다.
복합 인덱스와 최좌측 접두사
복합 인덱스 는 행을 , 그다음 , 그다음 순으로 정렬합니다. 컬럼의 에 대해서만 사용할 수 있습니다: , , — 하지만 단독이나 에는 . 가 고정되기 전까지는 그 컬럼들이 정렬되어 있지 않기 때문입니다.
InnoDB 인덱스는 B+tree입니다. 모든 리프가 같은 깊이에 있고 리프들이 연결되어 빠른 범위 스캔이 가능한 균형 트리죠. 조회는 O(log n)이며, 거대한 테이블에서도 페이지 읽기 몇 번이면 됩니다.
복합 인덱스 는 행을 , 그다음 , 그다음 순으로 정렬합니다. 컬럼의 에 대해서만 사용할 수 있습니다: , , — 하지만 단독이나 에는 . 가 고정되기 전까지는 그 컬럼들이 정렬되어 있지 않기 때문입니다.
(a, b, c)abca(a, b)(a, b, c)b(b, c)aCREATE INDEX idx_abc ON events (user_id, status, created_at);
-- USES the index (leftmost prefix, range on the last column)
SELECT * FROM events
WHERE user_id = 7 AND status = 'open' AND created_at > '2026-01-01';
-- Does NOT use it: skips the leftmost column
SELECT * FROM events WHERE status = 'open';
컬럼은 선택도가 높은 것 / 등호 조건을 앞에, 범위 컬럼을 마지막에 두세요. 범위 조건(>, BETWEEN)에 도달하면 그 뒤의 컬럼은 탐색(seek)에 사용할 수 없습니다.
인덱스가 쿼리가 읽는 모든 컬럼을 포함하면, InnoDB는 인덱스만으로 답을 낼 수 있습니다 — 클러스터형 인덱스로 되돌아갈 필요가 없죠. EXPLAIN에는 Using index가 표시됩니다.
CREATE INDEX idx_cover ON events (user_id, status, id);
EXPLAIN SELECT id FROM events WHERE user_id = 7 AND status = 'open';
-- Extra: Using index <- covering, no clustered-index lookup
복합 인덱스와 커버링 인덱스는 느린 다중 조건 쿼리를 단일 인덱스 탐색으로 바꾸는 방법입니다. 컬럼 순서를 잘못 잡거나, 두 번째 컬럼에 대한 쿼리가 인덱스를 사용할 것이라 기대하는 것은 "존재하는" 인덱스가 여전히 사용되지 않는 가장 흔한 이유입니다.
주니어부터 시니어까지 상세한 답변이 포함된 IT 면접 질문 라이브러리.
후원하기