Back-End/MySQL

[MySQL] 인덱스가 있어도 Full Scan을 하는 경우

siyamaki 2023. 12. 20. 13:57

쿼리 튜닝을 하던 도중 인덱스 설정이 되어 있는데도 자꾸 Full Scan을 한다

 

다중 컬럼 인덱스가 적용된 테이블이었는데 구조는 아래와 같았다.

 

COL_A(PK) COL_B(DATE) COL_C(CODE) COL_D(DATE)
A1234567 20230123 01 20230125
A1234568 20230201 04 20230204

 

COL_B는 등록일자, COL_D는 응답일자로 사용중이었으며, COL_C는 지정된 코드값을 가져 카디널리티가 매우 낮았다

테이블의 ROW 수는 대략 1500만개가 있는 상황이었다.

 

원래 테이블에 등록된 인덱스는 INDEX_A(COL_C, COL_B), INDEX_B(COL_C, COL_D)가 있었고

INDEX_A의 카디널리티는 대략 6만 INDEX_B의 카디널리티는 대략 3만이었다.

 

SELECT * FROM A WHERE COL_C = '04' AND COL_B BETWEEN '20230101' AND '20230131'로 쿼리를 수행하면

INDEX_B가 있음에도 불구하고 조회 시간이 대략 2분 30초쯤 걸렸다.

실행계획을 확인하면 옵티마이저가 COL_C 때문에 더 높은 카디널리티를 가진 INDEX_A를 가지고 테이블 스캔을 수행하고 있었다.

 

COL_C는 01 ~ 07 사이의 고정된 값을 가지는 중복성이 매우 높은 값이라 INDEX가 불필요하여 바로 제거를 하였고,

INDEX_A(COL_B), INDEX_B(COL_D)로 새로 만들어 위 쿼리를 그대로 수행하니 5초만에 개선되었다.