如何查看sql查询是否使用了索引?

1. explain 执行计划, 

通过执行计划可以了解MySQL选择了什么执行计划来执行SQL,并且SQL的执行过程到此结束,即并不会真正的往下交给执行器去执行;最终的目的还是优化MySQL的性能。

我们通过EXPLAIN语句来查看查看MySQL如何执行语句的信息;EXPLAIN语句可以查看SELECTDELETEINSERTREPLACTUPDATE语句。

mysql> explain select * from city where id <3;
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | city  | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    2 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.05 sec)

字段说明:

字段描述备注
id 该SELECT标识符  
select_type 该SELECT类型  
table 输出结果的表  
partitions 匹配的分区  
type 表的连接类型  
possible_keys 查询时可能的索引选择 只是有可能选择的索引,但是也能最后选择的索引不在该字段中
key 实际选择的索引 需要重点了解的
key_len 所选KEY的长度  
ref 列与索引的比较  
rows 表示MySQL认为执行查询必须检查的行数 innodb中是个估算值
filtered 按表条件过滤的行百分比  
Extra 执行情况的附加信息 需要重点了解的

 2. type表的连接类型说明:

type列输出介绍如何联接表,接下来列举常见联接类型,性能从最佳到最差排序:

system

const     

首先,system是最优的,它的意思是表只有一行(但效果我没演示出来),是const类型的一种特例,所以就把这两个列一块了。

eq_ref  在多表连接时,连接条件(ON)使用了唯一索引(UNIQUE NOT NULL,PRIMARY KEY)时,走eq_ref

ref      出现的条件是: 查找条件列使用了索引但不是PRIMARY KEYUNIQUE KEY。其意思就是虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。

fulltext

ref_or_null

index_merge

unique_subquery

index_subquery

range        是基于索引的范围扫描,包含>,<,>=,<=,!=,like,in,not in,or,!=,not in的情况会走range;出现range的条件是:查询条件列是非PRIMARY KEYUNIUQE KEY的索引列,也就是说条件列使用了索引,但该索引列的值并不是唯一的,这样的话,即使很快的找到了第一条数据,但仍然不能停止的在指定的范围内继续找。

index           全索引扫描,根据条件扫描索引然后再回表查询数据, 因为索引有序所以要比all效率高那么一奶奶了.

ALL          全表扫描,效果最差,什么情况下会走ALL?  1.查询字段是非索引字段, 2.查询条件中包含!= not in like 

小结

 

执行计划算是MySQL优化部分的内容了,想要弄懂首先要对SQL语句非常熟练,并且也要非常熟练索引相关的知识,还需要熟悉存储引擎,因为有些情况是基于指定存储引擎下的结果;除此之外,想要弄懂Extra栏,需要同时结合表的索引情况、查询语句、优化器(MySQL会优化我们的SQL)、以及EXPLAINtype栏和rows栏等综合分析出现的各种情况。

 

这里单独对Extra的几种情况做下总结:

 

  • Using index:表示使用索引,如果只有Using index,表示使用覆盖索引返回数据而没有回表查询的操作。
  • Using index;Using where:说明在使用索引的基础上还需要回表查询记录,可以考虑只返回指定的字段和建立联合索引来尝试避免回表查询情况。
  • Using index condition:说明会先根据走索引过滤结果,然后再根据其他子句的情况做回表查询操作。
  • Using where:表示在查询中很可能出现了回表查询的情况,可以观察是否加个索引来优化。
  • Using temporary:表示MySQL需要创建临时表来保存临时结果;通常出现在包含不同列的GROUP BYORDER BY子句时,另外也时常跟Using filesort一起出现。
  • Using filesort:表示在使用索引之外,还需要额外的排序操作,也可以根据具体情况添加索引来解决。

 

转自张开老师的博客

 

posted @ 2021-12-21 09:14  urls  阅读(5578)  评论(0编辑  收藏  举报