EXPLAIN
구문은 어떻게 명령문을 실행하는지에 대한 정보를 제공한다.
{EXPLAIN | DESCRIBE | DESC}
tbl_name [col_name | wild]
{EXPLAIN | DESCRIBE | DESC}
[explain_type]
{explainable_stmt | FOR CONNECTION connection_id}
{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] select_statement
explain_type: {
FORMAT = format_name
}
# 실행 계획 포맷 형식
format_name: {
TRADITIONAL
| JSON
| TREE
}
# 실행 가능한 구문
explainable_stmt: {
SELECT statement
| TABLE statement
| DELETE statement
| INSERT statement
| REPLACE statement
| UPDATE statement
}
EXPLAIN Output Format
Optimizer 가 명령문 실행 계획에 대해서 출력하고 실행 계획은 어떻게 명령문이 진행되는지 테이블 조인 방법과 순서에 대해서 알려준다.
Column | Json name | Meaning |
---|---|---|
id | select_id | SELECT 쿼리 식별자 |
select_type | None | SELECT 쿼리 타입 |
table | table_name | 테이블명 |
partitions | partitions | 일치하는 파티션 |
type | access_type | 조인 타입 |
possible_keys | possible_keys | 선택 가능한 인덱스 |
key | key | 실제로 선택된 인덱스 |
key_len | key_length | 선택된 인덱스의 길이 |
ref | ref | 인덱스와 비교된 컬럼 |
rows | rows | 검사된 행 추정치 |
filtered | filtered | 테이블 조건에 필터링된 행 개수 |
Extra | None | 추가적인 정보 |
id
SELECT
식별자이고 쿼리 내에 시퀀스한 번호이다. 만약 행이 다른 행의 결과와 union 참조면 이 값은 NULL 일 수 있다. 이 경우 테이블 컬럼은 <unionM,N>
와 같이 표시된다.
select_type
Value | Meaning |
---|---|
SIMPLE | 단순 조회 쿼리 |
PRIMARY | 가장 바깥 쿼리 |
UNION | UNION 구문에서 두 번째 이후 쿼리 |
DEPENDENT UNION | outer query 에 의존하는 UNION 구문에서 두 번째 이후 쿼리 |
UNION RESULT | UNION 결과 |
SUBQUERY | 첫 번째 서브 쿼리 |
DEPENDENT SUBQUERY | outer query 에 의존하는 첫 번째 서브 쿼리 |
DERIVED | 임시로 생성된 테이블 |
DEPENDENT DERIVED | 다른 테이블에 의존하는 임시로 생성된 테이블 |
MATERIALIZED | 서브 쿼리의 결과를 임시로 저장하는 테이블 |
UNCACHEABLE SUBQUERY | 서브 쿼리의 결과를 캐싱하지 않고 재계산 |
UNCACHEABLE UNION | UNION 구문에서 두 번째 이후 쿼리에 unreachable subquery 가 포함 |
table
출력 행이 참조하는 테이블의 이름이다. <unionM,N>
, <derivedN>
, <subqueryN>
종류를 가진다.
partitions
쿼리와 일치하는 레코드가 있는 파티션이다. 파티션이 없는 테이블의 경우에는 NULL 값이다.
type
Value | Meaning |
---|---|
system | 테이블이 하나의 행만 가질 경우 조인 타입 |
const | 테이블에서 쿼리를 처음부터 읽었을 때 최대 일치하는 행이 하나일 경우 조인 타입. pk, unique key로 비교할 때 사용된다. |
eq_ref | 테이블에서 한 행을 읽는다. |