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 ...)
에서col1
이NULL
일 때 수행된다.- 서브쿼리의 결과가 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 조건을 사용했다는 의미.