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

explain 을 통한 실행 계획 파악

id 컬럼

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

select 가 3개 실행 결과의 id 도 3개
여러 라인의 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 키워드가 붙을때

DERIVED

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

UNCACHEABLE SUBQUERY

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

  • SUBQUERY 를 바깥쪽의 영향을 받지 않으므로 처음 한 번만 실행해서 그 결과를 캐시한다.
  • DEPENDENT SUBQUERY 는 의존하는 바깥쪽 쿼리의 칼럼의 값 단위로 캐시해두고 사용한다.
  • 사용자 변수가 서브쿼리에 사용된 경우
  • NON-DETERMINISTIC 속성의 스토어드 루틴이 서브 쿼리 내에 사용된 경우
  • UUID() 나 RAND() 와 같이 결과값이 호출할 때마다 달라지는 함수가 서브 쿼리에 사용된 경우
사용자 변수가 들어간 서브쿼리 때문에 캐시할 수 없다.

UNCACHEABLE UNION

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

--

--

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store