explain 명령어 뒤에 쿼리문을 작성하면 해당 쿼리의 실행 계획(Query Plan)을 확인할 수 있습니다.
explain 쿼리문
실행 계획(Query Plan)이란 쿼리가 데이터에 접근하는 동작과정과 접근 계획을 말합니다.
항목 | 설명 |
---|---|
id | 쿼리 안에 있는 select 문에 대한 순차적인 식별자 |
select_type | select 문의 유형 |
table | 참조 되거나 참조 하고 있는 table |
partitions | 테이블의 파티션중 어떤 파티션을 사용했는지 등의 정보 |
type | table 이 join 되고 있는 방식 |
possible_keys | 테이블에서 row 를 매핑시키기 위한 key 목록을 나열 |
key | 실제적으로 쿼리 실행에 사용된 key 의 목록 |
key_len | MySQL이 사용한 인덱스의 길이 |
ref | key column 에 지정된 인덱스와 비교되는 column 또는 constant |
rows | 결과 산출에 있어서 접근되는 record 의 수 |
filtered | MySQL 엔진에 의해 필터링되어 제거된 레코드를 제외하고 최종적으로 남은 레코드의 비율(%) |
extra | 실행계획에 있어서 SQL이 해석되어지는 부가적인 정보 |
위의 실행 계획(Query Plan) 항목 중 중요한 몇 가지만 정리하겠습니다.
SIMPLE
단순 select ( union이나 서브쿼리를 사용하지 않음 )
PRIMARY
가장 외곽에 있는 select문
UNION
union 된 쿼리문 중 두번째 혹은 그 뒤의 select문
DEPENDENT UNION
union 된 쿼리 중 외곽 쿼리에 의존적
UNION RESULT
union의 결과물
SUBQUERY
서브쿼리의 첫번째 select
DEPENDENT SUBQUERY
서브쿼리의 첫번째 select, 바깥 쪽 쿼리에 의존적이다.
DERIVED
from절의 서브쿼리
조인타입을 나타냅니다.
속도와 아주 밀접한 항목입니다.
아래로 갈 수록 좋지 않습니다.
system
테이블에 단 하나의 행만 존재(=시스템 테이블).
const 조인의 특별한 형태입니다.
const
하나의 매치되는 행만 존재하는 경우.
하나의 행이기 때문에 상수로 간주되며, 한번만 읽어들이기 때문에 무척 빠릅니다.
eq_ref
조인수행을 위해 각 테이블에서 하나의 행만이 읽혀지는 형태.
const 타입 외에 가장 훌륭한 조인 타입입니다.
ref
조인이 키 값을 기반으로 단일 행을 선택할 수 없는 경우.
사용되는 키가 몇 개의 행만 일치하는 경우 이는 좋은 조인 유형입니다.
fulltext
fulltext index를 사용하여 수행됩니다.
ref_or_null
이 조인 유형은 ref와 비슷하지만 MySQL이 NULL값 을 포함하는 행을 추가로 검색합니다.
하위 쿼리를 해결하는 데 자주 사용됩니다.
index_merge
인덱스 병합 최적화가 적용되는 조인타입 입니다.
range
인덱스를 사용하여 주어진 범위 내의 행들만 추출됩니다.
ref 컬럼은 이 타입의 조인에서 NULL 입니다.
range 타입은 키 컬럼이 상수와 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN 또는 IN 연산에 사용될때 적용됩니다.
index
이 타입은 인덱스가 스캔되는걸 제외하면 ALL과 같습니다.
보통 인덱스 파일이 데이터 파일보다 작기 때문에 ALL보다 빠릅니다.
ALL
이전 테이블과의 조인을 위해 풀스캔이 됩니다.
만약 조인에 쓰인 첫 테이블이 고정이 아니라면 비효율적입니다. 그리고 대부분의 경우 아주 느리며, 보통 상수값이나 상수인 컬럼값으로 row를 추출하도록 인덱스를 추가하여 ALL 타입을 피할 수 있습니다.
Real MySQL 8.0(백은빈, 이성욱 지음)
https://gradle.tistory.com/4
https://weicomes.tistory.com/154