Today I Learned
explain에서 나오는 select_type 컬럼
id 컬럼
조인되는 테이블의 갯수만큼 생성이된다.
id의 숫자는 작을 수록 쿼리의 바깥부분이거나 먼저 접근한 테이블이고,
id의 숫자가 높을 수록 쿼리의 안쪽부분이거나 나중에 접근한 테이블이다.
단위 SELECT 쿼리로 1개이면 idx는 모두 같은 숫자이다.
select_type 컬럼
SIMPLE
PRIMARY
UNION
DEPENDENT UNION
UNION RESULT
SUBQUERY
DEPENDENT SUBQUERY
DERIVED
UNCACHEABLE SUBQUERY
UNCACHEABLE UNION
종류가 다양하다.
SIMPLE: UNION이나 서브쿼리르 사용하지 않는 단순한 SELECT 쿼리인 경우
PRIMARY: SELECT쿼리의 실행계획에서 가장 바깥쪽 쿼리
UNION: UNION으로 결합한 단위 SELECT 쿼리들
DEPENDENT UNION: dependent 가 붙은 select_type은 외부의 영향을 받은 것을 의미한다. select_type이 dependent union인 테이블을 보면 dept_emp인데 외부 쿼리의 employees e를 참조하고있다.
즉 외부에 의존적이기때문에 dependent가 붙음. 그리고 서브쿼리는 일반적으로 외부쿼리보다 서브쿼리가 먼저실행되고 이게 더 빠르다.
근데 dependent가 붙은 서브쿼리는 절대 외부쿼리보다 먼저실행될수없기때문에 보통 dependent가 붙으면 비효율적인 경우가 많다.
UNION RESULT: UNION 결과를 담아두는 테이블을 의미한다. UNION RESULT는 실제쿼리에서 단위쿼리가 아니라서 별도로 id값이 부여되지 않는다. <union 1,2>
라는 의미는 id가 1,2번인 단위쿼리를 union했다는 것을 의미한다.
SUBQUERY: MySQL 실행계획에서 from 절에 사용된 서브쿼리는 DERIVED (파생테이블) 이라고 표시되고, 그 외의 위치는 전부 SUBQUERY라고 표시된다.
DEPENDENT SUBQUERY: DEPENDENT UNION 처럼 외부 쿼리 의존적인거.
DERIVED: DERIVED는 단위 select 쿼리 실행결과를 메모리나 디스크에 임시테이블을 생성하는 것을 의미. 이 임시테이블을 파생테이블이라고도 함.
UNCACHEABLE SUBQUERY: 캐싱이 안되는 서브쿼리를 말함. 서브쿼리는 처음 결과를 별도로 캐싱한다. 그리고 조건이 똑같은 서브쿼리가 실행될 때 결과캐시에서 값을 가져온다. UNCACHEABLE SUBQUERY는 이 캐시를 어떤 특정 요소에 의해 사용을 할수없는 것을 나타낸다.