Database/Mysql

[Real MySQL] 10-2. 실행 계획: 실행 계획 확인

noahkim_ 2025. 3. 12. 11:44

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.


1. 출력 포맷

  • 단순 테이블 형태
  • JSON (FORMAT 옵션)
  • TREE (FORMAT 옵션)

 

2. 쿼리 실행 시간 확인

EXPLAIN ANALYZE

  • 실행 계획 및 단계별 소요 시간 정보 확인

 

TREE 형태
  • 들여쓰기는 호출 순서를 의미함
    • 같은 레벨에서는 상단에 위치한 라인이 먼저 실행
    • 다른 레벨에서는 가장 안쪽에 위치한 라인이 먼저 실행

 

예시
explain analyze 
    select e.hire_date, avg(s.salary) 
    from employees e 
    inner join salaries s on s.emp_no = e.emp_no 
    and s.salary > 50000 and s.from_date<='1990-01-01' and s.to_date > '1990-01-01'
    where e.first_name='Matt' group by e.hire_date;
-> Table scan on <temporary>  (actual time=0.001..0.006 rows=48 loops=1)
    -> Aggregate using temporary table  (actual time=16.410..16.423 rows=48 loops=1)
        -> Nested loop inner join  (cost=465.39 rows=124) (actual time=2.039..16.233 rows=48 loops=1)
            -> Index lookup on e using ix_firstname (first_name='Matt')  (cost=81.55 rows=233) (actual time=1.804..3.601 rows=233 loops=1)
            -> Filter: ((s.salary > 50000) and (s.from_date <= DATE'1990-01-01') and (s.to_date > DATE'1990-01-01'))  (cost=0.69 rows=1) (actual time=0.052..0.054 rows=0 loops=233)
                -> Index lookup on s using PRIMARY (emp_no=e.emp_no)  (cost=0.69 rows=10) (actual time=0.048..0.051 rows=10 loops=233)

실행 순서

  1. INDEX ix_firstname
  2. INDEX PRIMARY KEY
  3. Filter
  4. Nested Loop Inner Join
  5. Aggregate
  6. Table Scan

 

  • actual time=0.048..0.051
    • employees 테이블에서 읽은 emp_no 기준으로 salaries 테이블에서 일치하는 레코드를 검색하는데 걸린 시간
    • 첫 번째 레코드 가져오는데 0.048초 걸림
    • 마지막 레코드 가져오는데 0.051초 걸림
  • rows=10
    • employees 테이블에서 읽은 emp_no에 일치하는 salaries 테이블의 평균 레코드 건수
  • loops=233
    • employees 테이블에서 읽은 emp_no을 이용해 salaries 테이블의 레코드를 찾는 작업이 반복된 횟수