9장 : 옵티마이저와 힌트
문제
문제 1 (주관식) :
쿼리 실행 절차
🥭 MySQL 서버에서 쿼리가 실행되는 과정을 서술하시오.
문제 2 (객관식) :
풀 테이블 스캔, 풀 인덱스 스캔
🍑 다음 중 MySQL 옵티마이저가 풀 테이블 스캔을 선택하는 조건이 아닌 것을 고르시오.
테이블의 레코드 건수가 너무 작아서 인덱스를 통해 읽는 것보다 풀 테이블 스캔을 하는 편이 더 빠른 경우
WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우
인덱스 레인지 스캔을 사용할 수 있는 쿼리라고 하더라도 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우
GROUP BY의 기준 칼럼이 드라이빙 테이블에 있든 드리븐 테이블에 있든 관계없이 인덱스를 전혀 사용하지 못하는 경우
문제 3 (주관식) :
쿼리 힌트- SUBQUERY
🍓 빈칸 채우기
NO_ICP 옵티마이저 힌트를 이용해 인덱스 컨디션 푸시다운 최적화를 비활성화 하기 위한 코드를 마저 완성하라.
정답
Q1
사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다.
“SQL parsing”이라고 하며, MySQL 서버의 “SQL 파서”라는 모듈로 처리한다. SQL 문장이 문법적으로 잘못됐다면 이 단계에서 걸러진다. 또한 이 단계에서 “SQL 파스 트리”가 만들어진다. MySQL 서버는 SQL 문장 그 자체가 아니라 SQL 파스 트리를 이용해 쿼리를 실행한다.
SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 체이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.
첫 번째 단계에서 만들어진 SQL 파스 트리를 참조하면서 다음과 같은 내용을 처리한다.
불필요한 조건 제거 및 복잡한 연산의 단순화
여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정
각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정
가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정ㄴ
두 번째 단계는 “최적화 및 실행 계획 수립” 단계이며, MySQL 서버의 “옵티마이저”에서 처리한다.
두 번째 단계가 완료되면 쿼리의 “실행 계획”이 만들어진다.
두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.
수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고, MySQL 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업을 수행한다.
첫 번째 단계와 두 번째 단계는 거의 MySQL 엔진에서 처리하며, 세 번째 단계는 MySQL 엔진과 스토리지 엔진이 동시에 참여해서 처리한다.
Q2
d. 임시 테이블을 사용하는 GROUP BY 처리 조건이다.
Q3
NO_ICP
Last updated