MySQL索引性能分析Explain工具的使用及参数介绍

image.png

Explain

是什么

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理输入的SQL语句的.从而进行性能分析.

使用:
Explain + SQL语句

能干嘛

  1. 表的读取顺序
  2. 数据读取操作的操作类型
  3. 那些索引可以使用
  4. 那些索引实际被使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询

字段概述

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra

id:

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
对应能干嘛的第一条

id的三种情况

  1. id 相同

image.png
id相同,顺序由上至下

  1. id 不同

image.png
id值越大,优先级越高,越被先执行

  1. id 相同不同同时存在

image.png

id值相同为同一组,从上往下顺序
在所有组中 id值越大,优先级越高,越被先执行

select_type

查询的类型

select_type描述
simple简单的select查询,查询中不包含子查询或者union
primary查询中若包含任何复杂的子部分,最外层则被标记为此
subquery在select或where列表中包含了子查询的查询
derived在from列表中包含的子查询被标记为deriver,MySQL会递归这些子查询,把结果放进临时表里
union若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select将被标记为derived
union result从union表获取结果的select

table

这一行数据是关于哪张表的

type

访问类型排列,显示查询使用了何种类型访问.
最好到最差依次是(常用)

system > const > eq_ref > ref > range > index > ALL

完整

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,查询至少得保证到range级别,最好能达到ref,

type描述
system表只有一行记录(等于系统表),这是const类型的特例
const表示通过一次索引就找到了,const用于比较primary key或者unique索引.因为只匹配一行数据,所以很快将主键至于where列表中.MySQL就能将该查询转换为一个常量
eq_ref唯一性索引扫描,某个匹配单独值只有一行记录
ref非唯一性索引扫描,返回匹配某个单独值的所有行
range只检索给定范围的行,使用一个索引来选择行(where id between … 就是使用了带有索引的id来划分了一个检索范围)
index遍历索引树检索(select id from t1就是遍历的索引树(id建有索引))
ALL全表遍历检索

possible_keys

显示可能应用在这张表中的索引,一个或多个.
查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被实际使用到

key

实际使用的索引,若为NULL,则没用使用索引,
查询中若使用了覆盖索引,则该索引仅出现在key列表中

key_len

索引中使用的字节数,显示的是最大可能长度,并非实际使用长度,即key_len是通过表定义计算出的,并非表内检索出的.在不损失精度的情况下,值越小越好

ref

用的什么值来检索索引
image.png
这里第二列ref为shared.t2.con1和const
在where第一个条件里匹配t1.col1时使用t2.col1,所以为shared.t2.con1
where第二个条件里匹配t1.col2用了一个常数,所以为const

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录需要读取的行数

Extra

包含不适合在其他列中显示但十分重要的额外信息

描述影响
Using filesort排序时产生,排序时使用了一个外部索引排序.无法利用表内索引进行排序.(排序时不是按照索引顺序直接读取,而是找到结果集后再次排序)降低性能(多做了一次排序操作)
Using temporary使用了临时表存储中间结果(order by)降低性能(增加了内存消耗)
Using index使用了覆盖索引,避免了访问表的数据行若同时出现using where 表明索引用来执行索引键值的查找若非,则表明索引用来读取数据而非执行查找提升性能,避免了访问数据行
Using where表使用了where过滤
Using join buffer使用了连接缓存
impossible wherewhere子句的值恒为false,不能用来获取元祖
distinct在找到第一个匹配项后就停止检索

索引覆盖
select的数据只需要从索引中即可获得,不需要回表读取数据行
image.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值