1. EXPAIN
- 쿼리 실행 계획을 보여주는 명령어 어떤 방식으로 쿼리를 실행할 것인지 계획을 보여준다.
- 쿼리의 성능 병목을 파악하고, 인덱스 사용 여부, 조인 방식, 테이블 액세스 방법 등을 확인할 수 있다.
- 주요 필드
| 타입 |
설명 |
| id |
쿼리 내에서 SELECT 문이 실행되는 순서 |
| select_type |
쿼리의 유형 (SIMPLE, PRIMARY, SUBQUERY) |
| table |
액세스되는 테이블명 |
| type |
테이블에 액세스하는 방식 (ALL, index, range, ref, eq_ref, const, system) |
| possible_keys |
쿼리에서 사용 가능한 인덱스 |
| key |
실제로 사용된 인덱스 |
| key_len |
사용된 인덱스 키 길이 |
| ref |
인덱스에서 어떤 컬림이 비교되는지 |
| rows |
추정 SELECT 행 수 |
| Extra |
추가 정보 (Using index, Using where, Using temporary, Using filesort) |
2. ANALYZE
- 실제 쿼리를 실행하면서 쿼리 계획과 함께 실제 수행된 실행 정보를 보여줌
- 실제 실행 시간을 포함한 세부 정보 제공
- EXPLAIN 과 달리 실제로 쿼리를 실행해 결과를 반환
- 성능 문제를 더 정확하게 파악 가능
EXPLAIN ANALYZE SELECT * FROM employees WHERE department_id = 10;
#result
-> Filter: (employees.department_id = 10) (cost=0.30 rows=2) (actual time=0.003..0.005 rows=2 loops=1)
-> Index scan on employees using dept_id (cost=0.20 rows=2) (actual time=0.002..0.004 rows=2 loops=1)
- Filter : where 절 조건이 필터로 적용되었음을 나타냄
- cost=0.30 rows=2 : EXPLAIN 이 예측한 비용과 결과의 예상 로우를 나타냄
- actual time=0.003..0.005 rows=2 loops=1 : 실제 실행된 쿼리의 시간과 실제 반환된 행 수, 쿼리 반복 횟수를 나타냄
- Index scan on employees using dept_id : 쿼리에서 사용한 인덱스를 나타냄