인덱스 컨디션 푸시다운
기존 방식
- MySQL 5.5 버전까지는 인덱스를 범위 제한 조건으로 사용하지 못하는 조건은 MySQL 엔진이 스토리지 엔진으로 아예 전달하지 않았다.
- Extra 칼럼의 “Using where”는 InnoDB 스토리지 엔진이 읽어서 반환해준 레코드가 인덱스를 사용할 수 없는 WHERE 조건에 일치하는지 검사하는 과정을 의미한다.
예를 들어, 다음과 같은 쿼리가 있다.
- 인덱스가 (last_name, first_name)인 employees 테이블
SELECT * FROM employees WHERE last_name='Action' AND first_name LIKE '%sal';
이때, 쿼리의 처리 과정은 다음과 같다.
last_name='Action'
조건으로 인덱스 레인지 스캔을 하여 테이블의 레코드를 읽는다.
- 인덱스 비교는 InnoDB 스토리지 엔진이 수행
- 테이블 레코드에서
first_name LIKE '%sal'
조건에 부합되는지 여부를 비교한다.
- 테이블 레코드에서 first_name 조건을 비교하는 작업은 MySQL 엔진이 수행
이렇게 되면 만약 (1)번 조건으로 10만 건을 찾고, (2)번 조건에 일치하는게 1건이라면 99,999건의 레코드 읽기가 불필요한 작업이 된다.
Index Condition Pushdown
- MySQL 5.6버전부터 도입됐다.
- 인덱스를 범위 제한 조건으로 사용하지 못한다고 하더라도 인덱스에 포함된 칼럼의 조건이 있다면 모두 같이 모아서 스토리지 엔진으로 전달할 수 있게 핸들러 API가 개선됐다.
- 즉, 위와 같은 예제에서 인덱스를 이용해 최대한 필터링까지 완료해서 꼭 필요한 레코드 1건에 대해서만 테이블 읽기를 수행할 수 있다.
- Extra 칼럼에 “Using Where”가 아닌 “Using index condition”이 출력된다.
- 인덱스 컨디션 푸시다운 기능은 고도의 기술력을 필요로 하는 기능은 아니지만 쿼리의 성능이 몇 배에서 몇십 배로 향상될 수 도 있는 중요한 기능이다.
Engin Condition Pushdown
- 인덱스 컨디션 푸시다운과 내부 작동 방식은 거의 흡사하지만, NDB(MySQL Cluster)에서만 사용 가능한 옵션이다.
Reference
참고 서적
📔 Real MySQL 8.0