커버링 인덱스

무지성개발자·2023년 10월 28일
0

커버링 인덱스

커버링 인덱스란 문자 그대로 쿼리 결과를 인덱스만으로 커버할 수 있는 것을 뜻한다.

데이터는 디스크에 있지만 메모리에 캐시되어 있는 인덱스만으로 쿼리 결과를 돌려 줄 수 있다면 디스크에 접근 하지 않아도 되어 쿼리속도가 향상되는 장점이 있다.

커버링 인덱스 쿼리 해보기

조건

  • 약 300만건 데이터에 복합 인덱스로 사용.(first_name, middle_name)
  • Explain으로 Extra에 Using index가 사용 됐는지 확인.

* 사용

WHERE 조건에 인덱스를 사용 했지만 Extra에 Using index이 없으니 커버링 인덱스를 사용하지 못함
이유는 Select 절의 *를 사용하여 인덱스가 아닌 컬럼도 보여줘야하기에 인덱스만으로 커버를 못함.

인덱스가 아닌 컬럼 select

key컬럼을 보면 인덱스를 사용하여 쿼리한 것을 알 수 있지만 Extra에 Using index이 없으니 커버링 인덱스를 사용하지 못함.

*와 마찬가지로 Select 절에서 인덱스가 아닌 컬럼을 보여줘야하기 때문.

인덱스 컬럼만 select

Select절까지 index 컬럼만 사용한 결과 Extra에 Using index을 확인할 수 있음.

인덱스 아닌 컬럼으로 Group by

Group by의 기준이 되는 컬럼이 인덱스가 아니니 역시 커버링 인덱스를 사용하지 못함.

인덱스 컬럼으로 Group by

Group by의 기준이 되는 컬럼이 인덱스니 인덱스 커버링이 사용된 걸 확인 할 수 있음.

Order by에 인덱스(생략)

group by와 같은 결과여서 생략..

스킵스캔을 이용한 커버링 인덱스

first_name, middle_name 순서의 복합 인덱스를 가지고 있는 상태에서 middle_name 만으로 쿼리문 작성Extra에 보면 Using index for skip scan을 확인 할 수 있음.

정리

커버링 인덱스는 결국 디스크에 접근을 안하고 인덱스 만으로 결과를 내야하기 때문에 조건절 뿐아니라 Select절까지 인덱스 컬럼으로 구성되어야 한다.


한 줄평 : 스킵스캔은 mysql 8.0부터 사용 가능.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글