본문 바로가기

SQL/MySql

실행계획 ID 컬럼과 select_type

 

실행 계획

 

- 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