백은빈, 이성욱 님의 "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)
실행 순서
- INDEX ix_firstname
- INDEX PRIMARY KEY
- Filter
- Nested Loop Inner Join
- Aggregate
- 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 테이블의 레코드를 찾는 작업이 반복된 횟수
'Database > Mysql' 카테고리의 다른 글
[Real MySQL] 13-1. 파티션: 개요 (0) | 2025.03.12 |
---|---|
[Real MySQL] 10-3. 실행 계획: 실행 계획 분석 (0) | 2025.03.12 |
[Real MySQL] 10-1. 실행 계획: 통계 정보 (0) | 2025.03.12 |
[Real MySQL] 9-3. 옵티마이저와 힌트: 힌트 (0) | 2025.03.11 |
[Real MySQL] 9-2. 옵티마이저와 힌트: 고급 최적화 (0) | 2025.03.10 |