Sitemap

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

4 min readJun 23, 2021

--

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

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

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

Press enter or click to view image in full size
explain 을 통한 실행 계획 파악

id 컬럼

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

Press enter or click to view image in full size
select 가 3개 실행 결과의 id 도 3개

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

Press enter or click to view image in full size
여러 라인의 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 으로 결합하는 쿼리 중 첫번째 쿼리를 제외한 쿼리
Press enter or click to view image in full size

DEPENDENT UNION

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

SUBQUERY

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

DEPENDENT SUBQUERY

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

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

DERIVED

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

UNCACHEABLE SUBQUERY

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

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

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

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

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

UNCACHEABLE UNION

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

--

--