서비스를 사용하는 유저들은 속도가 느린 것을 싫어한다. 바로바로 데이터를 확인하고 싶어하기 때문이다. 때문에 속도 개선을 하는 것은 개발자로서 빠질 수 없는 태스크중 하나이다. 응답 속도를 향상시키기 위해 애플리케이션 로직을 잘 구현했지만, 여전히 느리다면 데이터베이스 쿼리를 의심해봐야 한다. 쿼리 튜닝만 해도 몇초 이상이 걸리던 로직을 ms내 시간대로 최적화할 수 있기 때문이다. 이때 최적화에 유용하게 사용되는 방법은 쿼리 실행계획을 확인하는 것이다.
SQL이 데이터베이스에서 어떻게 처리되는지 확인하는 것은 중요하다. 이때 확인하는 것이 실행계획이다. 기본적으로 SQL을 작성하고 실행을 하게 되면 데이터베이스가 내부적으로 처리할 수 있는 과정이 실행되는데, 이때 많은 단계를 거쳐 실제 데이터를 찾는 경우가 발생할 수 있다. 이것을 Explain 실행계획을 통해 파악할 수 있다.
EXPLAIN SELECT ... FROM ...
SQL문은 아래와 같다.
explain
select
*
from user u
left join user_rate_limit_setting urls on u.id = urls.userId;
실행결과는 아래와 같다.
+--+-----------+-----+----------+----+------------------------------+----+-------+----+----+--------+------------------------------------------+
|id|select_type|table|partitions|type|possible_keys |key |key_len|ref |rows|filtered|Extra |
+--+-----------+-----+----------+----+------------------------------+----+-------+----+----+--------+------------------------------------------+
|1 |SIMPLE |u |null |ALL |null |null|null |null|1 |100 |null |
|1 |SIMPLE |urls |null |ALL |IDX_c4bd0330a997e1cbb833a34cd7|null|null |null|2 |100 |Using where; Using join buffer (hash join)|
+--+-----------+-----+----------+----+------------------------------+----+-------+----+----+--------+------------------------------------------+
여기서 중요한 필드만 확인해보자면