옵티마이저 스위치: 인덱스 컨디션 푸시 다운

공부하는 감자·2024년 3월 23일
0

MySQL

목록 보기
29/74
post-thumbnail

인덱스 컨디션 푸시다운

기존 방식

  • 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';

이때, 쿼리의 처리 과정은 다음과 같다.

  1. last_name='Action' 조건으로 인덱스 레인지 스캔을 하여 테이블의 레코드를 읽는다.
    • 인덱스 비교는 InnoDB 스토리지 엔진이 수행
  2. 테이블 레코드에서 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

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글