【MySQL】explain 执行计划各字段解析

MySQL 如何读写数据?icon-default.png?t=N7T8https://blog.csdn.net/weixin_43551213/article/details/140862538

MySQL 索引icon-default.png?t=N7T8https://blog.csdn.net/weixin_43551213/article/details/140847916

在上一篇文章中提到了索引,而添加索引是优化 SQL 语句的一个方式,但是什么时候需要添加索引呢?

在 mysql 可以使用 explain 关键字查看 sql 语句的执行计划,而根据执行计划便可以制定对应的优化方案

首先,我们先执行以下 sql 语句:

EXPLAIN SELECT * FROM product WHERE productId = "81301125340733440"

 可以看出,在结果中有多个字段,接下来就对一些关键字段进行解析:

字段format=json时的名称说明
idselect_id该语句的唯一标识
select_type/查询类型
tabletable_name表名
partitionspartitions匹配的分区
typeaccess_type联接类型
possible_keyspossible_type可能的索引选择
keykey实际选择的索引
key_lenkey_length索引的长度
refref索引的哪一列被引用了
rowsrows估计要扫描的行数
filteredfiltered符合查询条件的数据百分比
Extra/附加信息

id 字段


id 表示执行 select 查询语句的序号,它是 sql 执行的顺序的标识,sql 按照 id 从大到小执行,id 相同的为一组,从上到下执行。

type 字段


type 字段表示的 sql 关联的类型或者说是访问的类型。

从这个字段中我们可以确定这条sql查找数据库表的时候,查找记录的大概范围是怎么样的,直接就能体现sql的效率问题。

type 字段的类型也是有比较多,主要常见掌握的有以下几个:system、const 、eq_ref 、ref 、range 、index 、ALL。

它的性能体现是从高到低。system > const > eq_ref > ref > range > index > ALL

类型说明
systemsystem 是 const 的特例,「表示表中只有一行记录」
constconst 表示通过索引一次就查找到了数据,一般 const 出现在「唯一索引或者主键索引中使用等值查询」,因为表中只有一条数据匹配,所以查找的速度很快
eq_refeq_ref表示「使用唯一索引或者主键索引扫描作为表链接匹配条件,对于每一个索引键,表中只有一条记录与之匹配」
refref性能比eq_ref差,「也表示表的链接匹配条件,也就是使用哪些表字段作为查询索引列上的值」
rangerange「使用索引来检索给定范围的行数据,一般是在 where 后面使用 between、<>、in 等查询语句就会出现 range」
index「index表示会遍历索引树」,index 会比 ALL 速度快一些,但是出现 index 说明需要检查自己的索引是否使用正确
ALL「ALL 与 index 的区别就是 ALL 是从硬盘中读取,而 index 是从索引文件中读取」,ALL 全表扫描意味着 Mysql 会从表的头到尾进行扫描,这时候表示通常需要增加索引来进行优化了,或者说是查询中并没有使用索引作为条件进行查询

ref 与 eq_ref 的区别就是:

  • eq_ref 使用的是唯一索引或者主键索引
  • ref 扫描后的结果可能会找到多条符合条件的行数据,本质上是一种索引访问,返回匹配的行

Extra 字段


该字段显示的是 sql 查询的额外信息,主要有以下几种情况:

Using index、Using where、Using temporary、Using temporary、Using join buffer、Impossible where、Select tables optimized away 

Using index

表示查询的列被索引覆盖,这个是查询性能比较高的体现,即所要查询的信息搜在索引里面可以得到,不用回表,索引被正确的使用

假如同时出现了using where,表示索引用于执行索引键值的查找;若是没有出现using where,则表示索引用于读取数据,而非执行查询的动作。

Using index condition

表示只用到了索引下推的条件。即在组合索引中涵盖的列中覆盖了搜索条件,那么会在筛选出来前先用条件过滤一遍,再去回表,减少回表次数

Using where

该属性与 Using index 相反,查询的列并没有被索引覆盖,where 条件后面使用的是非索引的前导列,它仅仅是使用了 where 条件而已

Using temporary

Using temporary 表示使用了临时表存储中间的结果,一般在对结果排序的时候会使用临时表

Using filesort 

Using filesort 表示文件排序,说明 Mysql 对数据使用了外部的索引进行排序,并没有使用表中的索引进行排序 

Using join buffer

Using join buffer 表示使用连接缓存

它强调在获取连接条件时,并没有使用索引,而是使用连接缓冲区来存储中间结果,若是出现该值,一般说明需要添加索引来进行优化了 

Select tables optimized away

表示 select 语句没有遍历表或者索引就返回数据了

 一  叶  知  秋,奥  妙  玄  心

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qx_java_1024

祝老板生意兴隆,财源广进!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值