filtered 칼럼
- 옵티마이저는 각 테이블에서 일치하는 레코드의 개수를 가능하면 정확히 파악해야 좀 더 효율적인 실행 계획을 수립할 수 있다.
rows
칼럼의 값은 인덱스를 사용하는 조건에만 일치하는 레코드를 건수를 예측한 것인데, 대부분 쿼리에서 WHERE 절에서 사용되는 조건이 모두 인덱스를 사용할 수 있는 것은 아니다.
- 특히 조인이 사용되는 경우, WHERE 절에서 인덱스를 사용할 수 있는 조건도 중요하지만 인덱스를 사용하지 못하는 조건에 일치하는 레코드 건수를 파악하는 것도 매우 중요하다.
filtered
칼럼은 필터링되고 남은 레코드의 비율을 의미한다.
- 예를 들어, 인덱스를 사용하는 조건과 인덱스를 사용하지 않는 조건이 같이 쓰인다면 다음과 같다.
- 인덱스를 사용하는 조건에 일치하는 건수 계산 (
rows
칼럼의 값)
- 1번의 결과에서 인덱스를 사용하지 않는 조건에 일치하지 않는 건수 계산 (
filtered
칼럼의 값)
- MySQL 서버 옵티마이저는 레코드 건수뿐만 아니라 다른 요소들도 충분히 감안해서 실행 계획을 수립하겠지만, 조인의 횟수를 줄이고 그 과정에 읽어온 데이터를 저장해둘 메모리 사용량을 낮추기 위해 대상 건수가 적은 테이블을 선행 테이블로 선택할 가능성이 높다.
- MySQL 8.0에서는
filtered
칼럼의 값을 더 정확히 예측할 수 있도록 히스토그램 기능이 도입되었다.
예제
employees
테이블과 salaries
테이블을 조인하는 쿼리이다.
employees
테이블의 e.first_name
과 salaries
테이블의 s.salary
조건은 인덱스를 사용할 수 있다.
- 두 테이블 중 나머지 조건들까지 합쳐서 최종적으로 일치하는 레코드 건수가 적은 테이블이 드라이빙 테이블로 선정될 가능성이 높다.
EXPLAIN
SELECT *
FROM employees e, salaries s
WHERE e.first_name = 'Matt'
AND e.hire_date BETWEEN '1990-01-01' AND '1991-01-01'
AND s.emp_no = e.emp_no
AND s.from_date BETWEEN '1990-01-01' AND '1991-01-01'
AND s.salary BETWEEN 50000 AND 60000;
- 실행 계획이 다음과 같이 나왔다고 하자.
employees
테이블의 실행 계획 중, rows
: 233, filtered
: 16.03
- 이는
employees
테이블에서 인덱스 조건에만 일치하는 레코드는 대략 233건이며, 이 중 16.03%만 인덱스를 사용하지 못하는 조건에 일치한다는 의미이다.
employees
테이블에서 salaries
테이블로 조인을 수행한 레코드 건수는 대략 37(233∗0.1603)건 정도였다는 것을 알 수 있다.
Reference
참고 서적
📔 Real MySQL 8.0