회사에서 쿼리 최적화를 위해 커버링 인덱스를 사용하기 위해 테스트하고 있는 중에 extra에서 using index condition가 나온 것을 보았다.
내가 알기론 using index가 나와야 되는 것으로 알고 있는데 어떤 방식이 다른지 기록해보려고 한다.

스토리지 엔진에서는 메모리나 디스크에서 데이터를 조회하고 조건문에 포함되는 연산이나 가공을 MYSQL 엔진에서 실행하게 된다.
여기서 스토리지 엔진에서 인덱스를 사용해 걸러진 데이터 중에서 MySQL엔진이 한번 더 걸러야되는 조건이 있다면 using where이 발생한다.
하지만 인덱스 범위 조건에 사용될 수 없어도 인덱스 조건을 같이 넘겨서 인덱스를 MYSQL 엔진에서 사용한다면 그때 using index condition이 발생된다.
MYSQL 5.6 버전 이상부터 실행된다.
explain
SELECT *
FROM product
WHERE price = 10000
AND name LIKE '%ab';
간단한 쿼리를 가져와보았다.


간단하게 보면 인덱스 범위가 아닌 조건도 추가해서 스토리지 엔진에서 처리해준다고 보면 될 것 같다.
인덱스를 사용할 때는 순서도 중요하다.
똑같은 복합 인덱스를 사용하였고 순서만 다르게 해주었다.
CREATE INDEX idx_pricename ON product(price,name);

CREATE INDEX idx_nameprice ON product(name, price);

보면 조건문에서 먼저 실행되는 price를 먼저 넣게 되면 Using index condition을 실행하고 반대가 되면 Using where을 실행하는 것을 볼 수 있다.
그래서 인덱스는 항상 신중해야하고 사용하는 퀴리문에 따라 차이가 많이 나게 됨을 알 수 있다.