MySQL 인덱스를 공부하다 보면 covering index라는 표현을 자주 보게 됩니다. 처음에는 일반 인덱스와 뭐가 다른지 헷갈리지만, 실제로는 쿼리 성능을 꽤 크게 바꿀 수 있는 중요한 개념입니다.
이 글에서는 아래 내용을 정리합니다.
- covering index가 무엇인지
- 왜 성능에 도움이 되는지
- 일반 인덱스와 무엇이 다른지
- 어떤 경우에 특히 유리한지
핵심은 covering index는 인덱스만 읽어도 쿼리에 필요한 정보가 다 있는 상태라서, 추가 테이블 접근을 줄일 수 있다는 점입니다.
covering index란 무엇인가
covering index는 쿼리가 필요로 하는 컬럼이 모두 인덱스 안에 들어 있어서, MySQL이 굳이 원본 row를 다시 찾지 않아도 되는 경우를 말합니다.
예를 들어:
- WHERE에 쓰는 컬럼
- SELECT에 필요한 컬럼
- ORDER BY에 필요한 컬럼
이 인덱스 안에서 모두 해결되면 커버링 인덱스 효과를 볼 수 있습니다.
왜 빠를 수 있을까
일반 인덱스는 찾는 기준만 빠르게 좁혀주고, 실제 컬럼 값을 얻기 위해 다시 테이블 row에 접근해야 할 수 있습니다.
반면 covering index는 인덱스 안에 필요한 정보가 다 있으므로:
- 추가 row lookup 감소
- I/O 감소
- 읽기 속도 개선
효과를 기대할 수 있습니다.
즉, “찾기”와 “가져오기”를 인덱스 안에서 함께 처리하는 느낌에 가깝습니다.
언제 특히 유리할까
아래 같은 읽기 패턴에서 특히 유리합니다.
- 자주 실행되는 조회 쿼리
- 결과 컬럼 수가 적은 목록 조회
- 정렬까지 함께 중요한 쿼리
즉, 큰 본문 데이터를 다 읽을 필요 없이 일부 컬럼만 자주 보는 경우에 잘 맞습니다.
무조건 만들면 좋을까
그렇지는 않습니다. 커버링 인덱스를 만들기 위해 컬럼을 많이 넣으면 인덱스가 커지고, 쓰기 비용도 늘 수 있습니다.
즉:
- 읽기 속도 개선
- 인덱스 크기 증가
- 쓰기 비용 증가
사이에서 균형을 봐야 합니다.
일반 인덱스와 어떤 차이로 보면 좋을까
- 일반 인덱스: 찾는 경로를 빠르게 만든다
- covering index: 찾고 가져오는 것까지 인덱스 안에서 끝낼 수 있다
이렇게 이해하면 초반에 감이 잘 잡힙니다.
자주 하는 오해
1. 인덱스가 있으면 다 커버링 인덱스다
아닙니다. 필요한 컬럼이 모두 인덱스에 있어야 합니다.
2. covering index는 항상 최고다
읽기에는 좋을 수 있지만, 인덱스 크기와 쓰기 비용을 같이 봐야 합니다.
3. SELECT * 에도 covering index 효과를 기대할 수 있다
필요 컬럼이 너무 많으면 현실적으로 어렵습니다.
FAQ
Q. covering index는 어디서 가장 효과가 큰가
반복되는 읽기 쿼리와 작은 결과셋 조회에서 특히 좋습니다.
Q. 어떻게 확인할 수 있나
실행 계획과 실제 쿼리 패턴을 같이 보면서 판단하는 것이 좋습니다.
Q. 입문자는 무엇부터 이해하면 좋을까
일반 인덱스와 covering index 차이, 그리고 SELECT 컬럼 수가 왜 중요한지부터 이해하면 좋습니다.
Read Next
- 인덱스 전체 설계 흐름은 MySQL index design 가이드와 가장 잘 이어집니다.
- 실행 계획 읽기는 MySQL EXPLAIN 가이드를 같이 보면 더 잘 보입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.