Mysql 之explain索引效率分析
一、explain语句
EXPLAIN [EXTENDED] SELECT select_options
二、字段分析
1、id
select识别符。这是select的查询序列号,id的值越大优先级别越高,越先被执行,如果id相同,执行顺序右上至下
2、select_type
select_type表示select语句的类型。
3、table
表示这一行的数据是关于哪张表的。
4、type
type表示的是表的连接类型。依次从最优到最差:system>const>eq_ref>ref>range>index>ALL
5、possible_keys
possible_keys列支出mysql能使用哪个索引在该表中找到行。如果这列是null,则没有相关的索引。在这种情况下,可以通过检查where子句查看它是否引用某些列或者适合索引的列来提高查询性能。如果是这样,可以创建适合的索引来提高查询的性能
6、key
key表示查询实际应用到的索引,如果没有选择索引,该列的值是null。想要强制使mysql使用或者忽视possible_type列中的索引,在查询中使用force index,use index 或者 ignore index。
7、key_len
key_len表示mysql选择的索引字段按字节计算的长度,如果键是null,则长度为null,注意通过key_len值可以确定mysql将实际使用一个多列索引中的几个字段
8、ref
ref表示使用哪个列或常数与索引一起来查询记录
9、rows
rows显示mysql表中进行查询时必须检查的行数
10、Extra
extra显示mysql在处理查询时的详细信息。
using index:覆盖索引
using where: 用where查找没有走索引,就需要优化
using index condition:查询的列如果不完全被索引覆盖 ,用到了最左原则
using temporary: 用到临时表,例:distinct去重,可以优化可以优化为using index,给去重列加索引,就会使用覆盖索引
using filesort:文件排序(内存排序,文件较大可能进行磁盘排序),可以优化为using index覆盖排序
三、索引效率分析
USING index 查询效率最高
Using where;USING index; 次于覆盖索引,使用了where过滤和索引查询
Using where 使用了where过滤
Using index condition; 使用了索引,但是要回表查询数据
Using filesort | Using temporary (两个差不多同级,效率都不高)