要精通SQL优化?首先要看懂explain关键字

前言在MySQL中,我们知道加索引能提高查询效率,这基本上算是常识了 。但是有时候,我们加了索引还是觉得SQL查询效率低下,我想看看有没有使用到索引,扫描了多少行,表的加载顺序等等,怎么查看呢?其实MySQL自带的SQL分析神器Explain执行计划就能完成以上的事情!
Explain有哪些信息先确认一下试验的MySQL版本,这里使用的是5.7.31版本 。

要精通SQL优化?首先要看懂explain关键字

文章插图
 
只需要在SQL语句前加上explain关键字就可以查看执行计划,执行计划包括以下信息:id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra,总共12个字段信息 。
要精通SQL优化?首先要看懂explain关键字

文章插图
 
然后创建三个表:
CREATE TABLE `tb_student` (  `id` int(10) NOT NULL AUTO_INCREMENT,  `name` varchar(36) NOT NULL,  PRIMARY KEY (`id`),  KEY `index_name` (`name`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';CREATE TABLE `tb_class` (  `id` INT(10) primary key not null auto_increment,  `name` VARCHAR(36) NOT NULL, `stu_id` INT(10) NOT NULL, `tea_id` INT(10) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='班级表';CREATE TABLE `tb_teacher` (  `id` INT(10) primary key not null auto_increment,  `name` VARCHAR(36) NOT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教师表';Explain执行计划详解explain的使用很简单,只需要在SQL语句前加上关键字explain即可,关键是怎么看explain执行后返回的字段信息,这才是重点 。
一、idSELECT识别符 。这是SELECT的查询序列号 。SQL执行的顺序的标识,SQL从大到小的执行 。id列有以下几个注意点:
  • id相同时,执行顺序由上至下 。
  • id不同时,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 。
EXPLAIN SELECT * FROM `tb_student` WHERE id IN (SELECT stu_id FROM tb_class WHERE tea_id IN(SELECT id FROM tb_teacher WHERE `name` = '马老师'));
要精通SQL优化?首先要看懂explain关键字

文章插图
 
根据原则,当id不同时,SQL从大到小执行,id相同则从上到下执行 。
二、select_type表示select查询的类型,用于区分各种复杂的查询,例如普通查询,联合查询,子查询等等 。
SIMPLE表示最简单的查询操作,也就是查询SQL语句中没有子查询、union等操作 。
PRIMARY当查询语句中包含复杂查询的子部分,表示复杂查询中最外层的 select 。
SUBQUERY当 select 或 where 中包含有子查询,该子查询被标记为SUBQUERY 。
DERIVED在SQL语句中包含在from子句中的子查询 。
UNION表示在union中的第二个和随后的select语句 。
UNION RESULT代表从union的临时表中读取数据 。
EXPLAIN SELECT u.`name` FROM ((SELECT s.id,s.`name` FROM `tb_student` s) UNION (SELECT t.id,t.`name` FROM tb_teacher t)) AS u;<union2,3>代表是id为2和3的select查询的结果进行union操作 。
要精通SQL优化?首先要看懂explain关键字

文章插图
 
MATERIALIZEDMATERIALIZED表示物化子查询,子查询来自视图 。
三、table表示输出结果集的表的表名,并不一定是真实存在的表,也有可能是别名,临时表等等 。
四、partitions表示SQL语句查询时匹配到的分区信息,对于非分区表值为NULL,当查询的是分区表则会显示分区表命中的分区情况 。
五、type需要重点关注的一个字段信息,表示查询使用了哪种类型,在 SQL优化中是一个非常重要的指标,依次从优到差分别是:system > const > eq_ref > ref > range > index > ALL 。
system和const单表中最多有一条匹配行,查询效率最高,所以这个匹配行的其他列的值可以被优化器在当前查询中当作常量来处理 。通常出现在根据主键或者唯一索引进行的查询,system是const的特例,表里只有一条元组匹配时(系统表)为system 。


推荐阅读