很清晰的Explain总结,妈妈再也不担心我的SQL优化了

在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)


  1. CREATE TABLE `film` ( 
  2.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  3.   `name` varchar(10) DEFAULT NULL, 
  4.   PRIMARY KEY (`id`), 
  5.   KEY `idx_name` (`name`) 
  6. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  7.  
  8.  
  9. CREATE TABLE `actor` ( 
  10.   `id` int(11) NOT NULL, 
  11.   `name` varchar(45) DEFAULT NULL, 
  12.   `update_time` datetime DEFAULT NULL, 
  13.   PRIMARY KEY (`id`) 
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
  15.  
  16.  
  17. CREATE TABLE `film_actor` ( 
  18.   `id` int(11) NOT NULL, 
  19.   `film_id` int(11) NOT NULL, 
  20.   `actor_id` int(11) NOT NULL, 
  21.   `remark` varchar(255) DEFAULT NULL, 
  22.   PRIMARY KEY (`id`), 
  23.   KEY `idx_film_actor_id` (`film_id`,`actor_id`) 
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

两个变种

explain extended

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


  1. mysql> explain extended select * from film where id =  
explain partitions

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

id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。 MySQL将 select 查询分为简单查询(SIMPLE)和复杂查询(PRIMARY)。 复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行**

select_type列

select_type 表示对应行是简单还是复杂的查询,如果是复杂的查询,又是上述三种复杂查询中的哪一种。 1.simple简单查询。查询不包含子查询和union

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章