explain의 사용법은 간단함. 보고 싶은 select 문 앞에 explain을 붙이면 된다.

EXPLAIN SELECT * FROM member WHERE member_id = 1;

image.png

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)

12개 출력 컬럼의 전체 개요

image.png

결과를 읽을때도 그냥 읽지 않고 중요한거 위주로 본다.

  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);
    

    image.png

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