explain命令是查看查询优化器如何决定执行查询的主要方法.
explain select * from table (mysql5.6开始支持 update等 非select操作) 会显示下图的数据,列是固定的.
编号,标识select所属的行. 如果语句中没有子查询,关联表查询,那么只会有唯一的select,每一行在这个列都显示 1 , 否则 select语句一般会顺序编号,对应其在原始语句中的位置.
输出行所引用的表名或者别名
从头到尾,全表扫描
跟全表扫描一样,不过mysql扫描是按照的索引顺序而不是行顺序(非自然排序),通常情况会按照索引顺序访问行,产生随机行文本,开销很大,可以避免排序. 如果在extra列中看到 using index ,说明 正在使用覆盖索引,只扫描索引的数据,而不是行数据,开销会小很多
范围扫描就是一个有限制的索引扫描. 只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range。
索引访问,查找和扫描的混合体. where条件的查找使用索引就是最明显的例子.
索引访问,mysql最多返回一条数据,多用于唯一索引查找
优化过程中就已经得到结果,不在访问表或索引
这一列显示了mysql可以使用哪些索引
mysql决定采用哪个索引来对表进行访问,有可能索引并不是在 possible_keys 列中
例如选择了覆盖索引
显示mysql在索引字段中可能的最大长度,而不是表中数据使用的实际字节数.
显示索引的哪一列被使用了
mysql 估计为了找到所需要的数据而读取的行数,某些时候可以用来获取大概值,比如统计在线人数,不需要很精确的情况下.
mysql5.1里新加的,使用explain extended 时出现.
所显示的是表里面某个条件的记录数的百分比所作的悲观估算
常见如下:
表示mysql使用覆盖索引,避免访问表.
表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。
使用到临时表
若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。
