Mysql数据库性能优化神器――explain关键字


本文摘自PHP中文网,作者V,侵删。

Explain工具介绍

使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈。在select语句之前增加explaion关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行SQL。

Explaion分析示例

1

2

-- actor建表语句:CREATE TABLE `actor` (  `id` int(11) NOT NULL,  `name` varchar(45) DEFAULT NULL,  `update_time`

datetime DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8

1

2

-- film建表语句:CREATE TABLE `film` (  `id` int(11) NOT NULL,  `name` varchar(10) NOT NULL,

PRIMARY KEY (`id`),  KEY `idx_name` (`name`))ENGINE=InnoDB DEFAULT CHARSET=utf8

1

2

3

-- film_actor建表语句:CREATE TABLE `film_actor` (  `id` int(11) NOT NULL,  `film_id` int(11) NOT NULL,  `actor_id`

int(11) NOT NULL,  `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`),KEY `idx_film_actor_id` (`film_id`,`actor_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

执行explain:

1

explain select * from actor;

explain01.jpg

如果是select语句返回的是执行结果,在select语句前面加上explain返回的是这条查询语句的执行SQL。

EXPLAIN两个变种

1、explain extended

会在explain的基础上额外提供一些查询优化的信息。紧随其后通过show warnings命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有filtered列,是一个半分比的值,rows*filtered / 100可以估算出将要和explain中前一个表进行连接的行数(前一个表指explain中的id值比当前表id值小的表)。

1

explain EXTENDED select * from actor where id = 1;

explain02.jpg

2、explain partitions

相比explain多了个partitions字段,如果查询是基于分区表的话,会显示查询将访问的分区。

Explain中的列

id列

id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。
id越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

1

explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der;

explain03.jpg

select type列

select type表示对应行是简单还是复杂的查询。
simple:简单查询。查询不包含子查询和union。

1

explain select * from film where id=1

explain04.jpg

primary:复杂查询中最外层的select
subquery:包含在select中的子查询(不在from子句中)
derived:包含在from子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表

1

explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der;

explain05.jpg

union:在union关键字随后的selelct。

1

EXPLAIN select 1 union all select 1;

explain06.jpg

table列

这一列表示explain的一行正在访问哪个表。
当from子句中有子查询时,table列是格式,表示当前查询依赖id=N的查询,于是先执行id=N的查询。
当有union时,UNION RESULT的table列的值为<union 1,2>,1和2表示参与union的select行id。

type列

这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行对应的大概范围。
依次从最优到最差的分别为:system>const>eq_ref>ref>range>index>All
一般来说,得保证查询达到range级别,最好达到ref。
NULL:MySQL能够在优化阶段分解查询语句,在执行阶段用不着在访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需在执行时访问表

1

EXPLAIN select min(id) from film;

explain07.jpg

constsystem:mysql能对查询的某部分进行优化并将其转换成一个常量(可看成是show warnings的结果)。用于primay key或unique key的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速读较快。system 是const的特例,表中只有一行元素匹配时为system。

1

EXPLAIN select * from (select * from film where id= 1) as tmp;

eq_ref:primay key或 unique key索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是const之外最好的联接类型,简单的select查询不会出现这种type。

1

EXPLAIN select * from (select * from film where id= 1) as tmp;

explain08.jpg

ref:相比eq_ref,不适用唯一索引,而是使用普通索引或者唯一索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行。
简单select查询,name是普通索引(非主键索引或唯一索引)

阅读剩余部分

相关阅读 >>

mysql中explain作用详解

查看explain中的key_len判断究竟用了哪个索引

mysql中explain用法和结果分析(详解)

mysql中explain作用

在mysql中的explain中的using where和using index

关于mysql explain中key_len的计算方法讲解

mysql中explain的使用以及性能分析

mysql explain的作用是什么?

mysql数据库性能优化神器――explain关键字

详解 mysql 5.7 优化:explain 执行计划

更多相关阅读请进入《explain》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...