什么是MySQL的执行计划(Explain关键字)?( 三 )


什么是MySQL的执行计划(Explain关键字)?文章插图
7)all:即全表扫描 , 需要从头到尾去查找所需要的行 。 一般这种情况下这需要增加索引来进行查询优化了
explain select * from t_user;
什么是MySQL的执行计划(Explain关键字)?文章插图
【possible_keys列】这一列的结果表明查询可能使用到哪些索引 。 但有些时候也会出现出现possible_keys 列有结果 , 而 后面的key列显示 null 的情况 , 这是因为此时表中数据不多 , 优化器认为查询索引对查询帮助不大 , 所以没有走索引查询而是进行了全表扫描 。
如果possible_keys列的结果是null , 则表明没有相关的索引 。 这时 , 可以通过优化where子句 , 增加恰当的索引来提升查询性能 。
【key列】这一列表明优化器实际采用哪个索引来优化对该表的访问 。 如果没有使用索引 , 则该列是 null 。
【key_len列】这一列表明了在索引里使用的字节数 , 通过这个值可以大致估算出具体使用了联合索引中的前几个列 。
key_len计算规则这里不再赘述 , 不同的数据类型所占的字节数是不一致的 。
【ref列】这一列表明了在key列记录的索引中 , 表查找值所用到的列或常量 , 常见的有:const(常量) , 字段名 , 如user.user_id
【rows列】这一列表明优化器大概要读取并检测的行数 。 跟实际的数据行数大部分情况是不一致的 。
【Extra列】顾名思义 , 这一列表明的是额外信息,这一列的取值对优化SQL非常有参考意义 。 常见的重要取值如下:
1)using index:所有被查询的字段都是索引列(称为覆盖索引),并且where条件是索引的前导列 , 出现这样的结果 , 是性能高的表现 。
explainselect group_id,group_name from t_group;
什么是MySQL的执行计划(Explain关键字)?文章插图
2)using where:被查询的列未被索引覆盖 , where条件也并非索引的前导列 , 表示 MySQL 执行器从存储引擎接收到查询数据,再进行“后过滤”(Post-filter) 。 所谓“后过滤” , 就是先读取整行数据 , 再检查此行是否符合 where 句的条件 , 符合就留下 , 不符合便丢弃 。
explain select * from t_user whereuser_name='user1';
什么是MySQL的执行计划(Explain关键字)?文章插图
3)using where Using index:被查询的列被索引覆盖 , 并且where条件是索引列之一但是不是索引的前导列 , 也就是没有办法直接通过索引来查询到符合条件的数据
explain select * from t_group where group_name = 'group1';
什么是MySQL的执行计划(Explain关键字)?文章插图
4)null:被查询的列没有被索引覆盖 , 但where条件是索引的前导列 , 此时用到了索引 , 但是部分列未被索引覆盖 , 必须通过“回表查询”来实现 , 不是纯粹地用到了索引 , 也不是完全没用到索引
explain select * from t_user where user_id='1';
什么是MySQL的执行计划(Explain关键字)?文章插图
5)using index condition:与using where类似 , 查询的列不完全被索引覆盖 , where条件中是一个前导列的范围;这种情况未能通过示例显现 , 可能跟MySQL版本有关系 。
6) using temporary:这表明需要通过创建临时表来处理查询 。 出现这种情况一般是要进行优化的 , 用索引来优化 。 创建临时表的情况:distinct , group by , orderby , 子查询等
explain select distinct user_name from t_user;