MySQL EXPLAIN 출력 열의 상세 한 설명
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 값 은 세 가지 상황 으로 나 뉜 다.
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 UNIONUNION 과 마찬가지 로 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 출력 열 에 관 한 더 많은 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL에서 JSON 인덱싱 - aarondfrancis사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 말하지만 완전히 정확하지는 않습니다. MySQL로 JSON 열을 인덱싱하는 것은 완전히 가능합니다! 사람들은 종종 MySQL로 JSON을 인덱싱할 수 없다고 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.