커버링 인덱스는 특정 쿼리의 조건과 반환에 필요한 컬럼을 모두 포함하여, 테이블의 실제 행을 추가로 읽지 않고 인덱스만으로 결과를 만들 수 있는 인덱스입니다. 커버링 여부는 인덱스 자체의 고정된 종류가 아니라 해당 쿼리와 인덱스의 관계로 결정됩니다.

예를 들어 다음 쿼리가 있다고 가정하겠습니다.

SELECT created_at, status
FROM orders
WHERE member_id = ?;

(member_id, created_at, status) 복합 인덱스가 있다면 조건 검색과 SELECT 결과를 모두 인덱스에서 얻을 수 있습니다. InnoDB의 Secondary Index 조회에서 Clustered Index로 다시 이동하는 과정이 줄어들기 때문에, 많은 행을 조회할수록 I/O 절감 효과가 커질 수 있습니다. MySQL의 전통적인 실행 계획에서는 Extra의 Using index가 커버링 인덱스 사용을 나타내는 경우가 많습니다.

하지만 SELECT 컬럼을 모두 넣어 인덱스를 지나치게 넓게 만들면 저장 공간과 쓰기 비용이 증가하고 캐시 효율이 낮아집니다. 자주 실행되고 성능 영향이 큰 쿼리를 중심으로 설계해야 합니다.

출처 및 참고자료