DataBase/MySQL

MySQL Explain 보는 법

레알윙 2022. 7. 31. 16:55
반응형

테이블 설계시 Index를 고민하면서 설계를 해야되며, 이를 이용해서 쿼리를 잘 작성해야 된다는 것을 알고 있었으나 

근래 회사 프로젝트를 진행하면서 더욱 중요하다는 것을 알게 되었다. 

좋은 쿼리를 만들 수 있는 방법이 실행계획을 보는 것을 알게 되었고 한번 정리를 해보고자 한다.

 

 

explain

예시

아래의 쿼리 앞에 사용쿼리 앞에 explain을 붙이면 발생되는 화면이다. (DB 클라이언트는 DBeaver를 사용)

실행계획

위의 실행계획을 보게 된다면 id, select_type, table, partitions, type, possible_keys, key, key_len, ref, rows를 볼 수 있는데 해당되는 컬럼의 타입은 아래와 같다.

 

select_type

id

해당 id 내에 있는 select문 에 대한 순서를 나타낸다. 

SIMPLE

단순한 SELECT 쿼리이며, 일반적으로 제일 바깥 SELECT 쿼리가 SIMPLE type으로 표시

PRIMARY

UNION이나 서브쿼리를 가질 때 가장 바깥쪽에 있는 단위 쿼리를 PRIMARY로 표시

UNION

UNION으로 결합하는 단위 SELECT 쿼리 가운데 첫번재를 제외한 두 번재 이후 단위 SELECT 쿼리

 

UNION RESULT

UNION 결과를 담아두는 테이블을 의미하며 실제 쿼리에서 단위 커리가 아니기 때문에 id값은 존재 하지 않는다.

SUBQUERY

FROM절 이외헤서 사용하는 서브 쿼리를 뜻한다.

DEPENDENT SUBQUERY

가장 바깥의 select문에 의존성적인 쿼리이다.

외부 쿼리 실행 후내부쿼리(서브쿼리)를 실행해야 되기 때문에 일반 서브쿼리보다 속도가 느릴 수도 있다.

DERIVED

FROM절 안에 있는 서브쿼리 문이다.

DEPENDENT SUBQUERY

UNCACHEABLE SUBQUERY & UNCACHEABLE UNION

캐시를 사용하지 못하는 쿼리

  • 사용자 변수가 서브쿼리에 사용된 경우
  • NOT-DETERMINISTIC 속성의 스토어드 루틴이 서브쿼리 내에 사용된 경우
  • UUID()나 RAND()와 같이 결괏값이 호출할 때마다 달라지는 함수가 서브쿼리에 사용된 경우  

캐시 사용법

  • UBQUERY는 바깥쪽(Outer)의 영향을 받지 않으므로 처음 한 번만 실행해서 그 결과를 캐시하고 필요할 때 캐시된 결과를 이용한다.
  • DEPENDENT SUBQUERY는 의존하는 바깥쪽(Outer) 쿼리의 칼럼의 값 단위로 캐시해두고 사용한다.  

 

반응형