MySQL EXPLAIN 출력 열의 상세 한 설명

11211 단어 mysqlexplain출력 열
1.프로필
EXPLAIN 문 구 는 MySQL 이 문 구 를 어떻게 실행 하 는 지 에 대한 정 보 를 제공 합 니 다.
EXPLAIN 은 SELECT,DELETE,INSERT,REPLACE,UPDATE 문구 와 함께 사용 된다.

mysql> EXPLAIN SELECT * FROM employees WHERE emp_no = 10001;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | employees | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
쉽게 말 하면 EXPLAIN 을 통 해 SQL 문 구 는 색인 을 가지 고 있 는 지,어떤 색인 을 가지 고 있 는 지 분석 할 수 있다.
EXPLAIN 은 SELECT 구문 에 사용 되 는 표 마다 한 줄 의 정 보 를 되 돌려 줍 니 다.MySQL 이 문 구 를 처리 할 때 읽 는 순서에 따라 출력 표 를 보 여 줍 니 다.
MySQL 은 내장 순환 연결(Nested-Loop Join Algorithms)을 사용 하여 모든 연결 을 분석 합 니 다.이 는 MySQL 이 첫 번 째 표 에서 한 줄 을 읽 은 다음 두 번 째 표,세 번 째 표 에서 일치 하 는 줄 을 찾 는 것 을 의미 합 니 다.모든 시 계 를 처리 한 후,MySQL 은 표 목록 을 통 해 선택 한 열 을 출력 한 후 시 계 를 찾 을 때 까지 거 슬러 올 라 갑 니 다.그 중 에 더 많은 일치 하 는 줄 이 존재 합 니 다.이 표 에서 다음 줄 을 읽 고 다음 표를 계속 하 세 요.
2.EXPLAIN 출력 열
MySQL 버 전 5.7.33Windows 10 64 비트
위의 그림 에서 보 듯 이 EXPLAIN 의 결과 에 포 함 된 표 두 id,selecttype、table、partitions、type、possible_keys、key、key_len,ref,rows,filered,Extra,이 필드 의 뜻 은 우리 가 학습 한 후에 실례 를 통 해 알 아 보 겠 습 니 다.
2.1 id
SELECT 식별 자,검색 중 SELECT 의 순서 번호.이 줄 이 다른 줄 의 병합 결 과 를 참조 하면 이 값 은 NULL 일 수 있 습 니 다.이 경우 표 열 은과 유사 한 값 을 표시 하여 이 줄 의 인용 id 값 을 M 과 N 의 줄 로 합 친 것 을 표시 합 니 다.
id 값 은 세 가지 상황 으로 나 뉜 다.
id 동일,실행 순서 위 에서 아래로

mysql> EXPLAIN (
    -> SELECT * FROM employees emp
    -> LEFT JOIN dept_emp de ON emp.emp_no = de.emp_no
    -> LEFT JOIN departments dept ON dept.dept_no = de.dept_no
    -> WHERE emp.emp_no = 10001);
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref                  | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------+
|  1 | SIMPLE      | emp   | NULL       | const  | PRIMARY       | PRIMARY | 4       | const                |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | de    | NULL       | ref    | PRIMARY       | PRIMARY | 4       | const                |    1 |   100.00 | NULL  |
|  1 | SIMPLE      | dept  | NULL       | eq_ref | PRIMARY       | PRIMARY | 12      | employees.de.dept_no |    1 |   100.00 | NULL  |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------------+------+----------+-------+
3 rows in set, 1 warning (0.03 sec)

id 가 다 릅 니 다.하위 조회 라면 id 의 번호 가 점점 증가 하고 id 의 값 이 클 수록 실 행 된 우선 순위 가 높 습 니 다.

mysql> EXPLAIN SELECT * FROM employees emp
    -> WHERE emp.emp_no NOT IN ( SELECT de.emp_no FROM dept_emp de 
    -> WHERE de.dept_no NOT IN ( SELECT dept_no FROM departments WHERE dept_name = 'Development'));
+----+-------------+-------------+------------+-------+-------------------+-----------+---------+-------+--------+----------+--------------------------+
| id | select_type | table       | partitions | type  | possible_keys     | key       | key_len | ref   | rows   | filtered | Extra                    |
+----+-------------+-------------+------------+-------+-------------------+-----------+---------+-------+--------+----------+--------------------------+
|  1 | PRIMARY     | emp         | NULL       | ALL   | NULL              | NULL      | NULL    | NULL  | 299468 |   100.00 | Using where              |
|  2 | SUBQUERY    | de          | NULL       | index | PRIMARY           | dept_no   | 12      | NULL  | 308493 |   100.00 | Using where; Using index |
|  3 | SUBQUERY    | departments | NULL       | const | PRIMARY,dept_name | dept_name | 122     | const |      1 |   100.00 | Using index              |
+----+-------------+-------------+------------+-------+-------------------+-----------+---------+-------+--------+----------+--------------------------+
3 rows in set, 1 warning (0.00 sec)

id 가 같 거나 다 릅 니 다.
id 가 같 으 면 한 그룹 이 라 고 볼 수 있 습 니 다.같은 그룹의 id 실행 순 서 는 위 에서 아래로,서로 다른 그룹 간 에 id 값 이 클 수록 실 행 된 우선 순위 가 높 습 니 다.

mysql> EXPLAIN SELECT * FROM employees emp
    -> WHERE emp.emp_no IN ( SELECT de.emp_no FROM dept_emp de 
    -> WHERE de.dept_no IN ( SELECT dept_no FROM departments WHERE dept_name LIKE '%Develop%'));
+----+--------------+-------------+------------+-------+-----------------+-----------+---------+-------------------------------+--------+----------+----------------------------------------------------+
| id | select_type  | table       | partitions | type  | possible_keys   | key       | key_len | ref                           | rows   | filtered | Extra                                              |
+----+--------------+-------------+------------+-------+-----------------+-----------+---------+-------------------------------+--------+----------+----------------------------------------------------+
|  1 | SIMPLE       | <subquery2> | NULL       | ALL   | NULL            | NULL      | NULL    | NULL                          |   NULL |   100.00 | NULL                                               |
|  1 | SIMPLE       | emp         | NULL       | ALL   | PRIMARY         | NULL      | NULL    | NULL                          | 299468 |     0.00 | Using where; Using join buffer (Block Nested Loop) |
|  2 | MATERIALIZED | departments | NULL       | index | PRIMARY         | dept_name | 122     | NULL                          |      9 |    11.11 | Using where; Using index                           |
|  2 | MATERIALIZED | de          | NULL       | ref   | PRIMARY,dept_no | dept_no   | 12      | employees.departments.dept_no |  38561 |   100.00 | Using index                                        |
+----+--------------+-------------+------------+-------+-----------------+-----------+---------+-------------------------------+--------+----------+----------------------------------------------------+
4 rows in set, 1 warning (0.01 sec)

2.2 select_type
조회 의 유형 은 주로 일반 조회,공동 조회,하위 조회 등 복잡 한 조 회 를 구별 하 는 데 쓰 인 다.
SIMPLE,PRIMARY,UNION,DEPENDENT UNION,UNION RESULT,SUBQUERY,DEPENDENT SUBQUERY,DERIVED,MATERIALIZED,UNCACHEBLE SUBQUERY,UNCACHEBLE UNION 포함
SIMPLE
간단 한 SELECT,UNION 이나 하위 검색 을 사용 하지 않 습 니 다.

mysql> EXPLAIN select * from employees where emp_no=10001;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table     | partitions | type  | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | employees | NULL       | const | PRIMARY       | PRIMARY | 4       | const |    1 |   100.00 | NULL  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
PRIMARY
검색 에 복잡 한 하위 부분 이 포함 되 어 있 으 면 가장 바깥쪽 검색 은 PRIMARY 로 표 시 됩 니 다.

mysql> EXPLAIN SELECT * FROM employees emp
    -> WHERE emp.emp_no IN ( SELECT max(emp_no) FROM dept_emp);
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
| id | select_type        | table | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra                        |
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
|  1 | PRIMARY            | emp   | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 299468 |   100.00 | Using where                  |
|  2 | DEPENDENT SUBQUERY | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL |   NULL |     NULL | Select tables optimized away |
+----+--------------------+-------+------------+------+---------------+------+---------+------+--------+----------+------------------------------+
2 rows in set, 1 warning (0.00 sec)
UNION
두 번 째 또는 더 뒤에 있 는 SELECT 문 구 는 UNION 뒤에 나타 나 면 UNION 으로 표 시 됩 니 다.

mysql> EXPLAIN (SELECT emp_no,dept_no FROM dept_emp LIMIT 10)
    -> UNION
    -> SELECT emp_no,dept_no FROM dept_manager;
+----+--------------+--------------+------------+-------+---------------+---------+---------+------+--------+----------+-----------------+
| id | select_type  | table        | partitions | type  | possible_keys | key     | key_len | ref  | rows   | filtered | Extra           |
+----+--------------+--------------+------------+-------+---------------+---------+---------+------+--------+----------+-----------------+
|  1 | PRIMARY      | dept_emp     | NULL       | index | NULL          | dept_no | 12      | NULL | 308493 |   100.00 | Using index     |
|  2 | UNION        | dept_manager | NULL       | index | NULL          | dept_no | 12      | NULL |     24 |   100.00 | Using index     |
| NULL | UNION RESULT | <union1,2>   | NULL       | ALL   | NULL          | NULL    | NULL    | NULL |   NULL |     NULL | Using temporary |
+----+--------------+--------------+------------+-------+---------------+---------+---------+------+--------+----------+-----------------+
3 rows in set, 1 warning (0.00 sec)
DEPENDENT UNION
UNION 과 마찬가지 로 UNION 이나 UNION ALL 구문 에 나타 나 지만 이 조 회 는 외부 조회 의 영향 을 받는다.
| UNION RESULT union_result Result of a UNION.
| SUBQUERY None First SELECT in subquery
| DEPENDENT SUBQUERY dependent (true) First SELECT in subquery, dependent on outer query
| DERIVED None Derived table
| MATERIALIZED materialized_from_subquery Materialized subquery
| UNCACHEABLE SUBQUERY cacheable (false) A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query
| UNCACHEABLE UNION cacheable (false) The second or later select in a UNION that belongs to an uncacheable subquery (see UNCACHEABLE SUBQUERY)
총결산
MySQL EXPLAIN 출력 열 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.MySQL EXPLAIN 출력 열 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기