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

MySQL 如何读写数据?https://blog.csdn.net/weixin_43551213/article/details/140862538

MySQL 索引https://blog.csdn.net/weixin_43551213/article/details/140847916

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

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

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

sql 复制代码
EXPLAIN SELECT * FROM product WHERE productId = "81301125340733440"

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

|---------------|-----------------|--------------|
| 字段 | format=json时的名称 | 说明 |
| id | select_id | 该语句的唯一标识 |
| select_type | / | 查询类型 |
| table | table_name | 表名 |
| partitions | partitions | 匹配的分区 |
| type | access_type | 联接类型 |
| possible_keys | possible_type | 可能的索引选择 |
| key | key | 实际选择的索引 |
| key_len | key_length | 索引的长度 |
| ref | ref | 索引的哪一列被引用了 |
| rows | rows | 估计要扫描的行数 |
| filtered | filtered | 符合查询条件的数据百分比 |
| 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

|--------|--------------------------------------------------------------------------------------------------------------------------------|
| 类型 | 说明 |
| system | system 是 const 的特例,「表示表中只有一行记录」 |
| const | const 表示通过索引一次就查找到了数据,一般 const 出现在**「唯一索引或者主键索引中使用等值查询」,因为表中只有一条数据匹配,所以查找的速度很快 |
| eq_ref | eq_ref表示
「使用唯一索引或者主键索引扫描作为表链接匹配条件,对于每一个索引键,表中只有一条记录与之匹配」** |
| ref | ref性能比eq_ref差,「也表示表的链接匹配条件,也就是使用哪些表字段作为查询索引列上的值」 |
| range | range**「使用索引来检索给定范围的行数据,一般是在 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 语句没有遍历表或者索引就返回数据了

一 叶 知 秋,奥 妙 玄 心

相关推荐
小光学长1 分钟前
基于vue框架的宠物销售管理系统3m9h3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
数据库
小菜yh25 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
Microsoft Word1 小时前
数据库系统原理(第一章 数据库概述)
数据库·oracle
华为云开源1 小时前
openGemini 社区人才培养计划:助力成长,培养新一代云原生数据库人才
数据库·云原生·开源
kejijianwen4 小时前
JdbcTemplate常用方法一览AG网页参数绑定与数据寻址实操
服务器·数据库·oracle
编程零零七4 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
高兴就好(石7 小时前
DB-GPT部署和试用
数据库·gpt
这孩子叫逆8 小时前
6. 什么是MySQL的事务?如何在Java中使用Connection接口管理事务?
数据库·mysql
Karoku0668 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
码农郁郁久居人下8 小时前
Redis的配置与优化
数据库·redis·缓存