출처: https://ibks-platform.tistory.com/374 [남산 아래 개발자들]
SQL을 처리하는 최저비용의 경로를 생성해주는 DBMS 내부 핵심엔진인 쿼리 옵티마이저가 쿼리를 수행할 때 생성한 최적의 처리경로를 실행계획(Query Plan)
MySQL에서는 실행할 쿼리문 앞에 'EXPLAN' 키워드를 이용해 실행계획에 대한 정보를 살펴 볼 수 있습니다.
이 실행계획을 이용하면 이슈가 발생하는 쿼리에 대한 이해를 도울 뿐만 아니라, 어떻게 최적화할 지에 대한 인사이트를 제공합니다.
어떤 식으로 제공을 하는 지 예제를 통해 확인해보겠습니다.
EXPLAIN SELECT * FROM short_url su LEFT OUTER JOIN short_url_stat sus ON su.hash = sus.hash WHERE deleted_date IS NULL;
위와 같이 1:N 관계를 가진 테이블을 조인하여 SELECT한 쿼리문 앞에 'EXPLAIN' 키워드를 붙여서 실행을 한 Output입니다.
이번 이슈 같은 경우는 총 22개의 테이블 조인 중 2번의 self 조인이 발생했는데, 이 조인에서 참조되는 컬럼이 인덱스 되지 않은 컬럼을 self 조인하게 되어 풀스캔되는 현상이었습니다. 따라서 Query Plan으로 보면, type의 최저의 성능을 내는 ALL 타입의 조인에서 참조 컬럼을 인덱싱하여 검증한 결과, ref 타입으로 변경되어 성능을 회복할 수 있었습니다.
Query Plan을 사용하여 간략하게라도 Plan을 볼 수 있다면 복잡한 쿼리라도 당황하지 않고 쿼리의 문제를 파악할 수 있는 스킬이 생기지 않을까 생각됩니다.
추가 자료: http://iloveulhj.github.io/posts/sql/sql-optimizer-principle.html