MySQL的explain命令语句提供了如何执行SQL语句的信息,解析SQL语句的执行计划并展示,explain支持select、delete、insert、replace和update等语句,也支持对分区表的解析。通常explain用来获取select语句的执行计划,通过explain展示的信息我们可以了解到表查询的顺序,表连接的方式等,并根据这些信息判断select执行效率,决定是否添加索引或改写SQL语句优化表连接方式以提高执行效率。本文参考官方文档:EXPLAIN Output Format对explain输出的内容进行说明,同时也对自己之前使用explain不清晰的方面进行总结。
本文使用的MySQL版本为官方社区版 5.7.24
。
mysql root@localhost:(none)> select version();
+------------+
| version() |
+------------+
| 5.7.24-log |
+------------+
1 row in set
Time: 0.066s
主要用法
{ EXPLAIN | DESCRIBE } [EXTENDED | PARTITIONS | FORMAT=[TRADITIONAL | JSON]] SQL_STATEMENT;
- EXPLAIN和DESCRIBE(可以简写成DESC)都可以用来查看语句的执行计划,但通常使用EXPLAIN较多;
- FORMAT选项可以指定执行计划输出信息为JSON格式,而且包含一些更详细的指标说明;
- EXTENDED和PARTITIONS选项可以输出更详细选项说明,语法上是为了兼容低版本MySQL,未来会废弃,默认使用EXPLAIN命令即可。
测试数据
本文基于MySQL官方示例数据库employee:Example Databases进行解析说明,使用到的表如下:
-- employees:
mysql root@localhost:employees> show create table employees\G;
***************************[ 1. row ]***************************
Table | employees
Create Table | CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`),
KEY `idx_first_last` (`first_name`,`last_name`),
KEY `idx_birth_hire` (`birth_date`,`hire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set
Time: 0.008s
-- dept_emp:
mysql root@localhost:employees> show create table dept_emp\G;
***************************[ 1. row ]***************************
Table | dept_emp
Create Table | CREATE TABLE `dept_emp` (
`emp_no` int(11) NOT NULL,
`dept_no` char(4) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`dept_no`),
KEY `dept_no` (`dept_no`),
CONSTRAINT `dept_emp_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE,
CONSTRAINT `dept_emp_ibfk_2` FOREIGN KEY (`dept_no`) REFERENCES `departments` (`dept_no`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set
Time: 0.010s
-- departments:
mysql root@localhost:employees> show create table departments\G;
***************************[ 1. row ]***************************
Table | departments
Create Table | CREATE TABLE `departments` (
`dept_no` char(4) NOT NULL,
`dept_name` varchar(40) NOT NULL,
PRIMARY KEY (`dept_no`),
UNIQUE KEY `dept_name` (`dept_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set
Time: 0.012s
输出说明
mysql root@localhost:employees> explain select count(*) from employees;
+----+-------------+-----------+------------+-------+---------------+---------+---------+--------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+--------+--------+----------+-------------+
| 1 | SIMPLE | employees | <null> | index | <null> | PRIMARY | 4 | <null> | 299512 | 100.0 | Using index |
+----+-------------+-----------+------------+-------+---------------+---------+---------+--------+--------+----------+-------------+
1 row in set
Time: 0.026s
通过以上示例语句得出explain输出有12个字段,主要说明如下表:
字段(Column) | J |
---|
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/13/13 | |
【大 中 小】【打印】 【繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部】 | |
上一篇:This function has none of DETER.. | 下一篇:Oracle数据库知识要点 |