1. 개요

Mysql의 실행계획이라 함은 데이터베이스가 SQL을 실행할 때 내부적으로 처리하는 방법이 있는데, 이 실행계획을 확인하여 쿼리를 튜닝할 수도 있다. → 2. 실행계획

하지만, EXPLAIN은 실행 결과에 기반한 것이 아닌 예측에 기반하기 때문에, 정확하게 확인할 수 없다. 때문에, 실행 결과에 기반하는 EXPLAIN ANALYZE 기법을 사용하여 쿼리를 분석할 수 있도록 한다.


2. EXPLAIN ANALYZE는 만능인가

위에서 말했듯이 EXPLAIN은 예측 기반으로 실행계획을 알려주기 때문에 정확한 확인이 어렵다. 때문에 실행 결과에 기반하여 실행계획을 알려주는 EXPLAIN ANALYZE의 분석이 더 정확하다. 그렇다고, 무조건 EXPLAIN ANALYZE가 좋지만은 않다. 실제로 쿼리를 실행하여 실행 시간, 행수 등을 측정하기 때문에 매우 느린 쿼리를 실행한다면 부하를 많이 받게 되기 때문에, 적절히 사용할 줄 알아야한다.


3. 분석

실행 방법은 간단하다. SQL 앞에 EXPLAIN ANALYZE 키워드를 추가하면 된다.

EXPLAIN ANALYZE
select
    urls.type as type,
    count(*)
from user_rate_limit_setting urls
where urls.status = 'DEACTIVATED'
group by urls.type;

결과는 아래와 같이 나온다.

-> Table scan on <temporary>  (actual time=116..116 rows=1 loops=1)
    -> Aggregate using temporary table  (actual time=116..116 rows=1 loops=1)
        -> Filter: (urls.`status` = 'DEACTIVATED')  (cost=48634 rows=48049) (actual time=0.0934..116 rows=264 loops=1)
            -> Table scan on urls  (cost=48634 rows=480493) (actual time=0.0859..90.4 rows=500002 loops=1)