MySQL Explain 실행 결과 정리 (id, select_type)

Min
4 min readJun 23, 2021

RealMySQL 을 읽고 정리한 내용입니다.

MySQL 에서는 EXPLAIN 이라는 명령으로 쿼리의 실행 계획을 확인할 수 있다. 실행 계획로 나오는 내용이 무엇을 의미하는지 정리하자

explain 쿼리 실행계획 파악을 어떻게 하는지 실행 계획의 결과가 의미하는 것들이 무엇인지 알아보자

explain 을 통한 실행 계획 파악

id 컬럼

하나의 쿼리는 여러 select 절로 이루어 질 수 있다. id 컬럼의 값은 select 쿼리 별로 부여 되는 식별자 값이다.

select 가 3개 실행 결과의 id 도 3개

하나의 select 문에서 여러 테이블을 조인 했을때는 조인되는 테이블의 개수 만큼 레코드가 출력되지만, id 컬럼의 값은 하나이다.

여러 라인의 id 컬럼은 하나

select_type 컬럼

select 쿼리가 어떤 타입의 쿼리인지 나타냄 다음의 값들이 올 수 있음

  • SIMPLE
  • PRIMARY
  • UNION
  • DEPENDENT UNION
  • SUBQUERY
  • DEPENDENT SUBQUERY
  • DERIVED
  • UNCACHABLE SUBQUERY
  • UNCACHABLE UNION

많네..

SIMPLE

  • 유니온이나 서브쿼리가 없는 단순한 쿼리인 경우 가장 바깥 쿼리
  • select_type 이 SIMPLE 인 단위 쿼리는 하나만 존재함

PRIMARY

  • 유니온이나 서브쿼리가 포함되어 있는 쿼리인 경우 가장 바깥 쿼리
  • select_type 이 PRIMARY 인 단위 쿼리는 하나만 존재함

UNION

  • UNION 으로 결합하는 쿼리 중 첫번째 쿼리를 제외한 쿼리

DEPENDENT UNION

  • UNION 으로 결합하지만, UNION 을 하는 단위쿼리가 외부에 영향을 받을때
  • 내부 쿼리가 외부 쿼리에 영향을 받을때 DEPENDENT 키워드가 붙는다.

SUBQUERY

  • FROM 절 이외에서 사용되는 서브쿼리
select 절의 서브쿼리

DEPENDENT SUBQUERY

  • 서브 쿼리가 바깥쪽 SELECT 쿼리에서 정의된 칼럼을 사용하는 경우
  • 외부 쿼리가 먼저 수행된 후 내부 쿼리 (서브 쿼리) 가 실행돼야 하므로 DEPENDENT 키워드가 없는 서브쿼리보다 처리 속도가 느릴 때가 많음
DEPENDENT 키워드가 붙을때

서브쿼리에 outer 쿼리의 emp_no 가 사용되어서 외부 쿼리에 영향을 받아 DEPENDENT 키워드가 붙었음

DERIVED

  • 서브 쿼리가 FROM 절에 사용된 경우
  • MySQL 은 FROM 절의 서브쿼리를 임시 테이블로 만들어서 처리한다.
  • DERIVED 형태의 서브쿼리를 조인으로 해결할 수 있다면 조인으로 처리해주는게 성능이 더 좋다. (조인이 최적화가 많이 되기 때문)

UNCACHEABLE SUBQUERY

조건이 똑같은 서브 쿼리가 실행될 때는 다시 실행하지 않고 이전의 실행 결과를 그대로 사용할 수 있게 서브 쿼리의 결과를 내부적인 캐시 공간에 담아둔다. (서브 쿼리 캐시는 쿼리 캐시나 파생 테이블과는 무관하다)

서브쿼리는 다음과 같이 캐시한다.

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

그런데 서브 쿼리에 포함된 요소에 의해 캐시 자체가 불가능할 수가 있다. 캐시를 사용하지 못하도록 하는 요소로는 다음과 같은 것 들이 있다.

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

UNCACHEABLE UNION

  • UNION 인 단위 쿼리에 캐시될 수 없는 요소가 있는 경우

--

--