Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析查询语句或是结构的性能瓶颈。在select语句之前增加explaion关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行SQL。 Explaion分析示例 -- 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 -- 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 -- 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: explain select * from actor; 如果是select语句返回的是执行结果,在select语句前面加上explain返回的是这条查询语句的执行SQL。 EXPLAIN两个变种 1、explain extended 会在explain的基础上额外提供一些查询优化的信息。紧随其后通过show warnings命令可以得到优化后的查询语句,从而看出优化器优化了什么。额外还有filtered列,是一个半分比的值,rows*filtered / 100可以估算出将要和explain中前一个表进行连接的行数(前一个表指explain中的id值比当前表id值小的表)。 explain EXTENDED select * from actor where id = 1; 2、explain partitions 相比explain多了个partitions字段,如果查询是基于分区表的话,会显示查询将访问的分区。 Explain中的列 id列 id列的编号是select的序列号,有几个select就有几个id,并且id的顺序是按select出现的顺序增长的。 explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der; select type列 select type表示对应行是简单还是复杂的查询。 explain select * from film where id=1
explain select (select 1 from actor where id = 1) from (select * from filmwhere id = 1) der; union:在union关键字随后的selelct。 EXPLAIN select 1 union all select 1; table列 这一列表示explain的一行正在访问哪个表。 type列 这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行对应的大概范围。 EXPLAIN select min(id) from film;
EXPLAIN select * from (select * from film where id= 1) as tmp;
EXPLAIN select * from (select * from film where id= 1) as tmp;
EXPLAIN select * from film where name='film1'; 关联表查询, EXPLAIN select film_id from film LEFT JOIN film_actor on film.id = film_actor.film_id;
EXPLAIN select * from actor WHERE id >1;
EXPLAIN select * from film;
EXPLAIN SELECT * from actor; possible_keys列 这一列显示select可能会使用哪些查询来查找。 EXPLAIN SELECT * from film_actor where film_id =1; key列 这一列显示MySQL实际采用哪个索引对该表的访问。 key_len列 这一列显示了mysql在索引里使用的字节数,通过这个值可以估算出具体使用了索引中的哪些列。 EXPLAIN SELECT * from film_actor where film_id =1; film_actor的联合索引idx_film_actor_id由film_id和actor_id两个id列组成,并且每个int是4字节。通过结果中的key_len=4可推断出查询使用了第一个列:film_id列来执行索引查找。 ken_len计算规则如下: 字符串 数值类型 时间类型 如果字段允许为NULL,需要1字节记录是否为NULL ref列 这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有: const(常量),字段名等。一般是查询条件或关联条件中等号右边的值,如果是常量那么ref列是const,非常量的话ref列就是字段名。 EXPLAIN SELECT * from film_actor where film_id =1; row列 这一列是mysql估计要读取并检测的行数,注意这个不是结果集的行数。 Extra列 这一列是额外信息。
explain select film_id from film_actor where film_id=1;
explain select * from film_actor where film_id > 1;
explain select * from actor where name ='a'
explain select DISTINCT name from actor; actor.name没有索引,此时创建了临时表来处理distinct。 explain select DISTINCT name from film; file.name建立了普通索引,此时查询时Extra是Using index,没有用到临时表。
explain select * from actor order by name; actor.name未创建索引,会浏览acotr整个表,保存排序关键字name和对应id,然后排序name并检索行记录。 explain select * from film order by name; film.name建立了idx_name索引,此时查询时extra是Using index。
explain select min(id) from film ; 有兴趣的同学可以访问PHP中文网了解更多相关内容:Mysql视频教程 (责任编辑:admin) |