실행 계획 분석: filtered 칼럼

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

MySQL

목록 보기
72/74
post-thumbnail

filtered 칼럼

  • 옵티마이저는 각 테이블에서 일치하는 레코드의 개수를 가능하면 정확히 파악해야 좀 더 효율적인 실행 계획을 수립할 수 있다.
    • rows 칼럼의 값은 인덱스를 사용하는 조건에만 일치하는 레코드를 건수를 예측한 것인데, 대부분 쿼리에서 WHERE 절에서 사용되는 조건이 모두 인덱스를 사용할 수 있는 것은 아니다.
    • 특히 조인이 사용되는 경우, WHERE 절에서 인덱스를 사용할 수 있는 조건도 중요하지만 인덱스를 사용하지 못하는 조건에 일치하는 레코드 건수를 파악하는 것도 매우 중요하다.
  • filtered 칼럼은 필터링되고 남은 레코드의 비율을 의미한다.
    • 필터링되어 버려지는 레코드의 비율이 아니다.
  • 예를 들어, 인덱스를 사용하는 조건과 인덱스를 사용하지 않는 조건이 같이 쓰인다면 다음과 같다.
    1. 인덱스를 사용하는 조건에 일치하는 건수 계산 (rows 칼럼의 값)
    2. 1번의 결과에서 인덱스를 사용하지 않는 조건에 일치하지 않는 건수 계산 (filtered 칼럼의 값)
  • MySQL 서버 옵티마이저는 레코드 건수뿐만 아니라 다른 요소들도 충분히 감안해서 실행 계획을 수립하겠지만, 조인의 횟수를 줄이고 그 과정에 읽어온 데이터를 저장해둘 메모리 사용량을 낮추기 위해 대상 건수가 적은 테이블을 선행 테이블로 선택할 가능성이 높다.
  • MySQL 8.0에서는 filtered 칼럼의 값을 더 정확히 예측할 수 있도록 히스토그램 기능이 도입되었다.

예제

  • employees 테이블과 salaries 테이블을 조인하는 쿼리이다.
    • employees 테이블의 e.first_namesalaries 테이블의 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(2330.1603)37(233*0.1603)건 정도였다는 것을 알 수 있다.

Reference

참고 서적

📔 Real MySQL 8.0

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

0개의 댓글