9장 : 옵티마이저와 힌트

문제

  1. 문제 1 (주관식) : 쿼리 실행 절차

    • 🥭 MySQL 서버에서 쿼리가 실행되는 과정을 서술하시오.

  2. 문제 2 (객관식) : 풀 테이블 스캔, 풀 인덱스 스캔

    • 🍑 다음 중 MySQL 옵티마이저가 풀 테이블 스캔을 선택하는 조건이 아닌 것을 고르시오.

      1. 테이블의 레코드 건수가 너무 작아서 인덱스를 통해 읽는 것보다 풀 테이블 스캔을 하는 편이 더 빠른 경우

      2. WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 적절한 조건이 없는 경우

      3. 인덱스 레인지 스캔을 사용할 수 있는 쿼리라고 하더라도 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우

      4. GROUP BY의 기준 칼럼이 드라이빙 테이블에 있든 드리븐 테이블에 있든 관계없이 인덱스를 전혀 사용하지 못하는 경우

  3. 문제 3 (주관식) : 쿼리 힌트- SUBQUERY

    • 🍓 빈칸 채우기

      1. NO_ICP 옵티마이저 힌트를 이용해 인덱스 컨디션 푸시다운 최적화를 비활성화 하기 위한 코드를 마저 완성하라.

        EXPLAIN
        SELECT /*+ {빈칸}(employees ix_lastname_firstname) */ *
        FROM employees
        WHERE last_name='Action' AND first_name LIKE '%sal';

정답

  • Q1

    1. 사용자로부터 요청된 SQL 문장을 잘게 쪼개서 MySQL 서버가 이해할 수 있는 수준으로 분리(파스 트리)한다.

      1. “SQL parsing”이라고 하며, MySQL 서버의 “SQL 파서”라는 모듈로 처리한다. SQL 문장이 문법적으로 잘못됐다면 이 단계에서 걸러진다. 또한 이 단계에서 “SQL 파스 트리”가 만들어진다. MySQL 서버는 SQL 문장 그 자체가 아니라 SQL 파스 트리를 이용해 쿼리를 실행한다.

    2. SQL의 파싱 정보(파스 트리)를 확인하면서 어떤 체이블부터 읽고 어떤 인덱스를 이용해 테이블을 읽을지 선택한다.

      첫 번째 단계에서 만들어진 SQL 파스 트리를 참조하면서 다음과 같은 내용을 처리한다.

      1. 불필요한 조건 제거 및 복잡한 연산의 단순화

      2. 여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정

      3. 각 테이블에 사용된 조건과 인덱스 통계 정보를 이용해 사용할 인덱스를 결정

      4. 가져온 레코드들을 임시 테이블에 넣고 다시 한번 가공해야 하는지 결정ㄴ

      5. 두 번째 단계는 “최적화 및 실행 계획 수립” 단계이며, MySQL 서버의 “옵티마이저”에서 처리한다.

      6. 두 번째 단계가 완료되면 쿼리의 “실행 계획”이 만들어진다.

    3. 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져온다.

      1. 수립된 실행 계획대로 스토리지 엔진에 레코드를 읽어오도록 요청하고, MySQL 엔진에서는 스토리지 엔진으로부터 받은 레코드를 조인하거나 정렬하는 작업을 수행한다.

    첫 번째 단계와 두 번째 단계는 거의 MySQL 엔진에서 처리하며, 세 번째 단계는 MySQL 엔진과 스토리지 엔진이 동시에 참여해서 처리한다.

  • Q2

    d. 임시 테이블을 사용하는 GROUP BY 처리 조건이다.

  • Q3

    1. NO_ICP

Last updated