[MySQL] 쿼리 실행 계획

select_type

수행할 쿼리의 타입을 의미한다.

  • SIMPLE : UNION이나 서브 쿼리를 사용하지 않는 단순 쿼리.
  • PRIMARY : UNION이나 서브 쿼리를 사용하는 쿼리의 바깥쪽 쿼리.
  • UNION : UNION을 수행할 대상이 되는 쿼리.
  • DEPENDENT UNION / DEPENDENT SUBQUERY : UNION이나 서브쿼리를 수행하면서 그 쿼리의 조건이 바깥 쿼리에 의해 영향을 받는 쿼리.
  • DERIVED : UNION이나 서브쿼리가 FROM 절에서 수행될 때 실행 결과를 메모리나 임시 테이블을 생성하게 된다. 이 때 쿼리타입은 DERIVED이며 만들어지는 테이블은 인덱스가 없으므로 성능상 불리하다.

table

쿼리가 수행될 대상 테이블을 의미한다. 별칭이 있으면 별칭으로 명시되며 <>로 감싸진 테이블은 UNION이나 DERIVED로 인해 생성된 파생 테이블을 의미한다.

type

MySQL 서버가 각 테이블의 레코드를 어떤 방식으로 읽었는지를 의미한다.

  • system : 레코드가 1건 혹은 0 건인 테이블을 참조할 때. (InnoDB는 제외)
  • const : 테이블의 레코드와 상관 없이 pk나 유니크 키 칼럼을 사용해 1건의 레코드만을 반환하는 경우.
  • eq_ref : pk나 unique non null index를 통해 조인을 하며 반드시 1건의 레코드만을 반환하는 경우.
  • ref : 동등 조건(==)으로 검색하는 경우. pk나 유니크 키의 제약 조건이 없으며 레코드가 반드시 1건이라는 보장이 없어도 된다.
  • fulltext : 전문 검색 인덱스를 사용해 조회하는 경우.
  • range : 인덱스 범위 스캔 방식의 접근을 사용하는 경우.
  • index : 인덱스를 사용하여 인덱스 풀 스캔을 하는 경우.
  • all : 풀 테이블 스캔이 일어나는 경우.

key

실행 계획에서 사용되는 인덱스를 나타낸다. type이 all과 같이 풀 테이블 스캔이 일어나는 경우는 null로 표현된다.

key_len

쿼리 수행을 위한 다중 컬럼으로 구성된 인덱스의 각 레코드에서 몇 바이트까지 사용했는지에 대한 정보를 의미한다.

ref

type이 ref일때 참조 조건이 어떤 방식으로 제공되었는지를 의미한다.

extra

  • distinct : distinct 쿼리를 수행하기 위해 조인하지 않아도 되는 항목은 무시하고 필요한 것만 조인한다.
  • full scan on NULL key : 서브쿼리를 수행할 때 서브쿼리를 위한 바깥 쿼리의 값이 NULL인 경우 MySQL에서 지정하는 NULL에 대한 연산을 수행하기 위해 풀 테이블 스캔이 일어날 수 있다는 것을 의미한다.
    • col1 IN (SELECT col2 FROM ...)에서 col1NULL일 때 수행된다.
    • 서브쿼리의 결과가 1건 이상의 레코드를 가진다면 NULL 아니라면 FALSE의 결과를 반환한다.
  • impossible HAVING : HAVING절의 조건을 만족하는 레코드가 존재하지 않을 경우.
  • impossible WHERE : WHERE 조건의 결과가 항상 FALSE인 경우.
  • no matching min/max row : 일반적으로 WHERE 조건절을 만족하는 레코드가 없을 경우 impossible WHERE을 명시하나, MN, MAX와 같은 함수가 사용되었을 때 표시된다. 결과로 NULL이 반환된다.
  • using filesort : orderBy를 수행할 때 적절한 인덱스를 찾지 못하여 정렬용 메모리 버퍼에 결과를 복사해 정렬을 수행하는 경우.
  • using index : 커버링 인덱스만을 사용하여 조회를 완료하는 경우.
  • using join buffer : Join을 할 때 뒤에 있는 테이블의 컬럼에 인덱스가 없는 경우. 드리븐 테이블을 드라이빙 테이블의 매 레코드마다 풀 테이블 스캔을 방지하기 위해 조인 버퍼에 드리븐 테이블을 임시 저장한다.
  • using where : MySQL 엔진으로 넘어와 where 조건을 사용했다는 의미.
Author: Song Hayoung
Link: https://songhayoung.github.io/2021/05/05/Database/query-execute-plan/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.