커버링 인덱스란 문자 그대로 쿼리 결과를 인덱스만으로 커버할 수 있는 것을 뜻한다.
데이터는 디스크에 있지만 메모리에 캐시되어 있는 인덱스만으로 쿼리 결과를 돌려 줄 수 있다면 디스크에 접근 하지 않아도 되어 쿼리속도가 향상되는 장점이 있다.
WHERE 조건에 인덱스를 사용 했지만 Extra에 Using index이 없으니 커버링 인덱스를 사용하지 못함
이유는 Select 절의 *
를 사용하여 인덱스가 아닌 컬럼도 보여줘야하기에 인덱스만으로 커버를 못함.
key컬럼을 보면 인덱스를 사용하여 쿼리한 것을 알 수 있지만 Extra에 Using index이 없으니 커버링 인덱스를 사용하지 못함.
*
와 마찬가지로 Select 절에서 인덱스가 아닌 컬럼을 보여줘야하기 때문.
Select절까지 index 컬럼만 사용한 결과 Extra에 Using index을 확인할 수 있음.
Group by의 기준이 되는 컬럼이 인덱스가 아니니 역시 커버링 인덱스를 사용하지 못함.
Group by의 기준이 되는 컬럼이 인덱스니 인덱스 커버링이 사용된 걸 확인 할 수 있음.
group by와 같은 결과여서 생략..
first_name, middle_name 순서의 복합 인덱스를 가지고 있는 상태에서 middle_name 만으로 쿼리문 작성Extra에 보면 Using index for skip scan을 확인 할 수 있음.
커버링 인덱스는 결국 디스크에 접근을 안하고 인덱스 만으로 결과를 내야하기 때문에 조건절 뿐아니라 Select절까지 인덱스 컬럼으로 구성되어야 한다.
한 줄평 : 스킵스캔은 mysql 8.0부터 사용 가능.