최근에 글을 쓰면서 SQL 책을 다시봤는데
커버링 인덱스 관련내용이 눈에 띄었다
실무에서 자주쓰이면서 이해하기에 딱 좋은 심플한 예제를 구했다
블로그에 정리해보려고 한다 ✍
우선 이전글과 테이블 구조가 똑같지만 써보도록 하겠슴다
0. 테이블 및 인덱스 정보
사원 테이블 | |||||
사원번호 | 생년월일 | 이름 | 성 | 성별 | 입사일자 |
int | date | varchar | varchar | enum('M', 'F') | date |
PK | 사원번호 |
I_입사일자 | 입사일자 |
I_성별_성 | 성별 + 성 |
1. 문제의 예제 쿼리와 실행계획
Select 사원번호
From 사원
Where 입사일자 Like '1993%'
And 사원번호 > 100000;
-- 실행결과
-- 사원번호
100030
100039
...
100207
100214
100216
1993년생이고 사원번호가 100001이상인 것을 뽑아내는 쿼리이다
(쿼리와 테이블 인덱스를 보고 어?🤔 하면서 문제점이 몇가지 보여야 한다)
실행계획을 한번 봐보자
Explain
Select 사원번호
From 사원
Where 입사일자 Like '1993%'
And 사원번호 > 100000;
type -> range
extra -> Using where
-> 스토리지 엔진으로 부터 range검색을 하여서 mysql엔진에 가져온 다음 where 절 조건으로 필터했다 라는 뜻입니다
-> 중요한 건 입사일자를 인덱스로 잡아놨는데 인덱스는 안탔네요
-> 우선 힌트를 줘서 인덱스를 강제로 태워봅시다
2. 힌트줘서 인덱스 태우기
Explain
Select 사원번호
From 사원 Use Index(I_입사일자)
Where 입사일자 Like '1993%'
And 사원번호 > 100000;
extra -> Using index for skip scan
-> mysql 8.0 이상버전 부터 지원한 skip scan기능입니다 -> 다음에 관련글을 써볼까 합니다
-> 조금 문제가 있어보이지만 어쨋든 인덱스를 태워봤습니다
(ps 해당 내용 maria db에서는 using index로 커버링 인덱스가 잘 수행된다고 하네요)
위에 테이블을 한번 더 봅시다 -> 입사일자는 date입니다 -> 그런데 like로 걸어놨네요
입사일자쪽 쿼리를 바꿔봅시다
3. Where절 입사일자 쿼리 변경
Explain
Select 사원번호
From 사원
Where 입사일자 >= '1993-01-01' and 입사일자 < '1994-01-01'
And 사원번호 > 100000;
type -> range
extra -> Using where; Using index
-> 입사일자 인덱스를 이용해서 범위스캔 후, 인덱스만 사용하여 결과를 출력하는 모습입니다
됐다! 나이뜨😎
4. 결론
커버링 인덱스?
Using index를 태우는걸 커버링 인덱스 스캔이라고 보면 됩니다
참고자료
업무에 바로쓰는 SQL튜닝
'DB' 카테고리의 다른 글
[Oracle] Oracle Text 대량 텍스트 색인화 (feat. 상품검색기능) (0) | 2024.06.07 |
---|---|
Oracle DB 관리자 필수 가이드: 기본 쿼리로 데이터베이스 리소스 정보 확인하기 (0) | 2024.05.22 |
[MYSQL 쿼리튜닝] 파티셔닝 (1) | 2024.01.06 |
[MYSQL 쿼리튜닝] UNION vs UNION ALL (2) | 2023.11.22 |