커버링 인덱스(covering index)
쿼리에 필요한 모든 결과를 제공하는 인덱스를 커버링 인덱스라고 한다. 쿼리는 인덱스 테이블에서 값을 반환하므로 실제 레코드를 읽어올 필요가 없다. 따라서 디스크 I/O가 절약된다.
예를 들어, 주문 테이블에 shop_id 인덱스가 있다고 해보자. 이때 아래의 쿼리를 실행하면 커버링 인덱스가 사용된다.
SELECT shop_id
FROM orders
WHERE shop_id = 6;
참고로 커버링 인덱스가 적용된 경우, 실행 계획의 Extra 필드에 Using index 라고 나온다.

+ Real MySQL 책 읽으면서 헷갈렸던 부분 🧐
Real MySQL 책에서 클러스터링 인덱스의 장점으로 아래와 같은 내용이 나온다.
테이블의 모든 세컨더리 인덱스가 프라이머리 키를 가지고 있기 때문에 인덱스만으로 처리될 수 있는 경우가 많음(이를 커버링 인덱스라고한다.)
처음에는 이 내용을 읽고 이해가 되지 않았다. 클러스터링 인덱스의 장점인데 왜 갑자기 커버링 인덱스가 나오지...? 생각했다.
지금 다시 생각해보니 클러스터링 인덱스의 특징 때문에 커버링 인덱스가 가능하다는 말인 것 같다.
클러스터링 인덱스만 레코드가 저장된 주소를 알고 있고, 세컨더리 인덱스는 레코드 주소가 아니라 프라이머리 키 값을 가지고 있다. 따라서 세컨더리 인덱스 중 이미 해당 인덱스만으로 쿼리 결과를 제공할 수 있다면 실제 레코드까지 가지 않아도 된다.
Reference
- [Real MySQL 8.0 1권] 8.8 클러스터링 인덱스
- https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_covering_index
- https://jojoldu.tistory.com/476 - 참고하면 좋은 자료