explain의 사용법은 간단함. 보고 싶은 select 문 앞에 explain을 붙이면 된다.
EXPLAIN SELECT * FROM member WHERE member_id = 1;

explain은 세가지 출력 형식이 있다. 우선 지금까지 살펴본 기본형식이 있음. traditional이라고 표현함.
다음은 json형식임.
EXPLAIN FORMAT=JSON SELECT * FROM member WHERE member_id = 1;
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "1.00"
},
"table": {
"table_name": "member",
"access_type": "const",
"possible_keys": [
"PRIMARY"
],
"key": "PRIMARY",
"used_key_parts": [
"member_id"
],
"key_length": "8",
"ref": [
"const"
],
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.00",
"eval_cost": "0.10",
"prefix_cost": "0.00",
"data_read_per_join": "792"
},
"used_columns": [
"member_id",
"email",
"member_name",
"grade",
"phone",
"birth_date",
"gender",
"created_at",
"updated_at"
]
}
}
}
근데 이건 인간이 보기엔 좀 불편함.
참고로 그리고 json형식에서는 원래 type이라고 하던 컬럼이 access_type으로 바뀜.
그리고 다음은 트리 형식이다. 서브쿼리등이 많을때 사용. 아래는 한줄짜리 select라 들여쓰기가 제대로 보이진 않았음.
EXPLAIN FORMAT=TREE SELECT * FROM member WHERE member_id = 1;
-> Rows fetched before execution (cost=0..0 rows=1)

결과를 읽을때도 그냥 읽지 않고 중요한거 위주로 본다.
id와 select_type확인
id가 같으면 같은 select에 속한다는 의미임. 그리고 같은 id안에서 어떤 select 유형이었는지 select_type으로 확인한다. subquery가 primary 타입보다 먼저 실행됨.
EXPLAIN SELECT * FROM member
WHERE member_id = (SELECT member_id FROM orders WHERE order_id = 100);

type 확인. 이게 가장 중요함. 테이블에 어떤 전략으로 접근했는지를 알려줌. const부터 all까지 등급이 있음.