我们前面已经学习了数据库索引原理,知道mysql数据库索引使用的是B+树结构,我们查询数据时,查询条件命中索引时,查询效率会特别高,如果没有命中索引,此时,则会全表扫描,耗时且消耗性能。

那么,一条sql语句执行下来,这个sql分别查询了哪些表,先查询的哪张表后查询的哪张表,以及是否使用了索引,使用了哪些索引,当前sql语句查询效率是否高效,这些数据从哪获取到呢?

此时,我们就可以使用执行计划来获取到这些数据信息了,下面我们一起来看看什么是执行计划以及执行计划的具体释放方法。

我们在查询sql语句前,添加explain关键字,mysql会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这一条sql语句。

我们先来执行一个简单的sql语句查看一下

Sql语句

explain select * from user_money a where a.user_name = '张三'

我们添加explain关键字后,我们可以看到返回的执行计划信息,mysql5.7返回的是12个字段,所代表的含义分别为:

1、id:查询sql语句id,当有多个查询时,将拆分为多个执行计划,每个执行计划都有一个id,id是sql执行成功的标识,sql从大到小的执行,id越大越先执行;当id相同的情况时,执行顺序由上至下。

2、select_type:查询类型,mysql中一共有8中查询类型,主要作用是用来标记查询类型,比如:普通查询、关联查询、子查询、左查询等

3、table:当前执行计划查询的表,如果给表起别名了,则显示别名信息

4、partitions:访问的分区表信息

5、type:查询方式,即mysql如何去查找的表中的行,查询方式是sql优化中一个很重要的指标,结果值从好到坏依次是:

依次从最优到最差分别为:system >const > eq_ref > ref > fulltext > ref_or_null > index_merge >unique_subquery > index_subquery > range > index > ALL

此处只讨论system、const、eq_ref、ref、range、index、all。

System:表中只有一行数据,此时根据索引查询一次就能找到,这个是const的特性,由于system平时不会出现,所以此处不做详细介绍。

Const:sql查询时根据索引一次就找到了,此时会显示为const,我们在前面学习过mysql索引的原理,知道mysql索引是由B+树构建,当树的层级越低,查询效率越高。Const即树的层级只有一层,此时查找索引在第一层就能找到数据,返回的是const。

eq_ref:唯一索引扫描,常见于主键和唯一索引扫描,索引在表中只对应一条记录

ref:与eq_ref相比,ref常见于非唯一索引扫描,通常能扫描到多条记录,还可见于唯一索引最左原则匹配扫描也会出现ref。

range:通常见于范围扫描,比如:in、大于小于等。索引根据给定范围进行检索

Index:索引全表扫描,此时扫描只扫描索引树,非数据库表

All:全表扫描

我们一条sql语句写的好不好,可以通过sql执行计划查看,通过type类型。All效率最低

6、possible_keys:可能使用到的索引

7、key:实际使用到的索引

8、key_len:当前使用的索引的长度

9、ref:关联id等信息

10、rows:查找到记录所扫描的行数

11、filtered:查找到所需记录所占总扫描记录数比例

12、Extra:额外的信息

2018年12月21日 22:41:20