실행 계획
- EXPLAIN EXTENDED나 EXPLAIN PARTITIONS 명령은 더 상세하게 실행 계획을 확인 할 수 있음
- 위쪽에 출력된 결과일수록 (id 컬럼의 갑이 작을수록) 쿼리의 바깥(outer) 부분이거나 먼저 접근한 테이블
아래쪽에 출력된 결과일수록 (d 컬럼의 값이 클수록) 쿼리의 안쪽(Inner) 부분 또는 나중에 접근한 테이블
id 컬럼
- 단위 SELECT 쿼리별로 부여되는 식별자 값
- SELECT 문장 안에서 여러 개의 테이블을 조인하면 조인되는 테이블의 개수만큼 실행 계획이 출력되지만 같은 아이디가 부여됨
- SELECT 문장은 하나인데 여러 겨의 테이블이 조인되는 경우 id값은 증가 하지 않음
select_type
- 각 단위 SELECT쿼리가 어떤 타입의 쿼리인지 표시되는 컬럼
SIMPLE
- 단순한 SELECT 쿼리인 경우 해당 쿼리 문장의 select_type은 SIMPLE로 표시
- SIMPLE인 단위 쿼리는 반드시 하나만 존재
- 일반적으로 제일 바깥 SELECT 쿼리에 표시
PRIMARY
- UNION이나 서브 쿼리가 포함된 SELECT 쿼리의 실행 계획에서 가장 바깥쪽에 있는 단위 쿼리는 PRIMARY로 표시
- PRIMARY 단위의 쿼리는 반드시 하나만 존재
- 제일 바깥 SELECT 쿼리에 표시
UNION
- UNION으로 결합하는 단위 SELECT 쿼리 가운데 첫 번째를 제외한 두 번째 이후 단위 SELECT 쿼리의 select_type은 UNION으로 표시
- UNION의 첫 번째 단위는 UNION 쿼리로 결합된 전체 집합의 select_type이 표시 됨.
- UNION ALL로 결합해 임시 테이블을 만들어서 사용하고 있으므로 UNION ALL의 첫번째 쿼리는 DERIVED가 표시된다.
DEPENDENT UNION
- UNION이나 UNION ALL로 집합을 결합하는 쿼리에 표시 됨.
- DEPENDENT는 UNION이나 UNION ALL로 결합된 단위 쿼리가 외부에 영향에 의해 영향을 받는 것을 의미
- 내부 쿼리가 외부의 값을 참조해서 처리될 대 DEPENDENT 키워드가 표시 됨.
- DEPENDENT 키워드를 포함하는 서브 쿼리는 외부 쿼리에 의존적이므로 절대 외부 쿼리보다 먼저 실행 될 수 없음
- DEPNEDENT가 포함되면 서버쿼리는 비효율적인 경우가 많음.
UNION RESULT
- UNION 결과는 담아두는 테이블을 의미
- MYSQL에서 UNION ALL 이나 UNION(DISTINCT) 쿼리는 모두 임시 테이블을 생성하게 됨.
- 실행 계획상 임시 테이블을 가리키는 라인의 select_type이다.
- 실제 쿼리에서 단위 쿼리가 아니기 때문에 별도 ID값은 부여되지 않음
SUBQUERY
- FROM절 이외에서 사용되는 서브 쿼리를 말함.
- FROM절에 사용된 서브 쿼리는 DERIVED라고 표시됨
- 그 외에 사용되는 서브쿼리는 전부 SUBQUERY로 표시 됨
- DERIVED는 파생 테이블이라고 이해하면 됨.
DEPENDENT SUBQUERY
- 서브 쿼리가 바깥쪽 (OUTER) SELECT 쿼리에 정의된 칼럼을 사용하는 경우
DERIVED
- 서브 쿼리가 FROM 절에 사용된 경우 MYSQL은 항상 select_type을 DERIVED인 실행 계획을 만듬
- DERIVED는 단위 SELECT 쿼리의 실행 결과를 메모리나 디스크에 임시 테이블을 생성하는 것을 의미
- 파생 테이블에는 인덱스가 전ㅇ=혀 없으므로 다른 테이블과 조인할 때 성능상 불리하다.
- 가급적 조인으로 해결하라.
UNCACHEABLE SUBQUERY
- 조건이 똑같은 서브 쿼리가 실행될 때는 이전의 실행 결과를 그대로 사용할 수 있게 서브 쿼리의 결과를 내부적인 캐시 공간에 담아둔다
- 캐시를 사용하지 못할 때 이 플랜이 표현된다.
- 캐시를 사용하지 못하는 요소
. 사용자 변수가 서브쿼리에 사용된 경우
. NOT-DETERMINSTIC 속성의 스토어드 루틴이 서브 쿼리 내에 사용된 경우
. UUID()나 RAND()와 같이 결과값이 호출될때 마다 달라지는 함수가 서브쿼리에 사용된 경우
'SQL > MySql' 카테고리의 다른 글
Mysql Lock (0) | 2017.11.20 |
---|---|
1부 3장. SQL 소개 (0) | 2017.11.15 |
쿼리 실행 절차 및 옵티마이저 종류 (0) | 2017.11.15 |
실행계획 (0) | 2017.11.15 |
mysql 정렬 (0) | 2017.11.15 |