目录
2.select_type 表示查询中每个select子句的类型
5.possible_keys 列出涉及到的字段上存在的索引
7.key_len 表示索引使用的字节数,根据这个只可以判断索引的使用情况
mysql执行计划就是解释当mysql执行查询语句的时候是如何在数据库中执行的、相关表是如何连接的、连接次序、有哪些索引和索引的具体使用情况、每个表的扫描数据量等等
可以通过这些数据来分析selelct语句的执行情况,从而对select语句进行优化
用法
explain +语句
执行计划参数与解释
我们可以看到参数有id,select_type,table,partition,type,possible_keys,key,key_len,ref,rows,filtered,Extra参数
1.id 表示SQL执行顺序
表示SQL执行的顺序,具体是根据一下规则
当id相同时,执行顺序由上至下
如果是子查询,id的序号会递增,id的值越大执行优先级越高,越先被执行
2.select_type 表示查询中每个select子句的类型
主要作用是区分普通查询、联合查询、子查询等复杂查询
1.SIMPLE
简单的select查询,查询中不包含子查询或者union
2.PRIMARY
查询中包含然和复杂的字部分嘴歪成查询则被标记为primary(嵌套查询的外部)
3.SUBQUERY
在select或where列表中包含了子查询
4.DERIVED
在from列表中包含子查询被标记为derived(衍生),mysql或递归执行这些子查询,将结果放在临时表里
5.UNION
若第二个select出现在union之后,则被标记为union,若union宝还在from子句的子查询中,外层select将被标记为drived
6.UNION RESULT
从union表获取结果的select
3.table 显示这一步所访问的表名称
4.type 对表的访问方式
常用的类型有:ALL、index、range、ref、eq_ref、const、system(从左到右,性能从差到好)
1.ALL
MySQL将遍历全表以找到匹配的行(遍历所有的记录)
2.index
index与ALL区别为index类型只遍历索引树(遍历所有的索引)
3.range
只检索给定范围内的行,使用一个索引来选择行(between,>,<)(可能使用多个索引)
4.ref
表示非唯一索引扫描,返回所有匹配的值(仅用一个索引,并且可能会回表)
5.eq_ref
类似ref,区别就在于使用的索引是唯一索引,对于每个索引的值,表中只有一条记录匹配(使用primary key或者unique key作为关联条件)(仅用一个索引,并且可能会回表)
6.const
通过索引一次命中,匹配一行数据(也就是说通过索引一次就找到了又且仅有一条的数据)
7.system
表中只有一行记录,相当于系统表(也就是说这个表里只有一条数据,一次就找到了数据)
5.possible_keys 列出涉及到的字段上存在的索引
查询涉及到的字段上存在的索引,索引将会被列出,但是不一定被查询实际使用
6.key 实际使用的索引
如果为NULL,则没有使用索引
7.key_len 表示索引使用的字节数,根据这个只可以判断索引的使用情况
表示用到所有的索引的字节数之和(?),key_len越小,说明索引效果越好
8.ref 显示索引的哪一列被使用了
如果可能,是一个常量const
9.rows 找到所需记录所需要的行数
10.extra 对查询所获的结果集排序的结果
using filesort
表示mysql对结果集进行外部排序,不能通过索引顺序达到排序效果,一般有的话都建议优化去掉,因为这样的查询对cou资源消耗大,延时大(不根据索引排序)
using index
覆盖索引扫描,表示查询在索引树中就可以查找所需数据,不用扫描表数据文件,往往说明性能不错(根据索引就能排序)
using tempporary
查询有使用临时表,一般出现于排序,分组和多表join的情况,查询效率不高,建议优化(使用临时表)
using where
sql使用了where过滤,效率较高
参考文章
膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili