MySQL Explain 关键字详解
概述
explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能
使用方式如下:explain + sql
explain select * from t1
执行计划各字段含义
1. id
- 如果 id 序号相同,从上往下执行
- 如果 id 序号不同,序号大先执行
- 如果两种都存在,先执行序号大,在同级从上往下执行
- 如果显示 NULL,最后执行,表示结果集,并且不需要使用它来进行查询
2. select_type
表示查询的类型,取值有如下:
SIMPLE:简单的 select 查询,不包含子查询或者 UNION


PRIMARY:复杂查询中最外层查询,比如使用 union 或 union all 时,id 为 1 的记录 select_type 通常是 primary

SUBQUERY:指在 select 语句中出现的子查询语句,结果不依赖于外部查询(不在 from 语句中)

DEPENDENT SUBQUERY:指在 select 语句中出现的查询语句,结果依赖于外部查询

DERIVED:derived 称为派生表,在 FROM 子句的查询语句,表示从外部数据源中推导出来的,而不是从 SELECT 语句中的其他列中选择出来的

UNION:若第二个 SELECT 出现在 UNION 之后,则被标记为 UNION;若 UNION 包含在 FROM 子句的子查询中,那么第一个 SELECT 将被标记为 DERIVED
UNION RESULT:UNION 的结果

DEPENDENT UNION:当 union 作为子查询时,其中第一个 union 为 dependent subquery,第二个 union 为 dependent union

3. table
表示当前行正在访问的表
4. type
表示查询使用的类型,性能由好到坏依次是:system > const > eq_ref > ref > range > index > all,一般来说能达到 range 级别,最好能达到 ref 级别
system:表只有一行(相当于系统表),是 const 类型的特例

const:针对主键或唯一索引的等值查询扫描,只返回一行数据

eq_ref:基于主键或唯一索引连接两个表,对于每个索引键值,只有一条匹配记录,被驱动表的类型为 eq_ref,这种类型只出现在 join

ref:非唯一性索引扫描,返回匹配多个符合条件的行


range:范围扫描,检索指定范围的行,一般出现在 where 语句出现 between、< 、>、in 等的查询

index:只遍历索引树即可找到匹配的数据,比如下例中 user_id 就是 orders 表的索引

all:遍历全表找到匹配的数据

5. possible_keys
显示可能使用到的索引,实际不一定被使用
6. key
实际使用的索引
7. key_len
索引使用的字节数,可通过该列计算查询中使用的索引的长度,主要用于联合索引
比如现有 users 表,执行以下 sql,该表有为 name 和 email 字段设置联合索引 index_name_email
explain select * from users where name = "张三" and email = "xxx@qq.com"
执行结果如下:

users 表结构如下:

name 和 email 字段都为 varchar,一个字符占 3 个字节,所以 key_len = 50 * 3 + 2 + 1 + 100 * 3 + 2 = 455,其中 varchar 需要额外占用 2 个字节,允许 NULL 值额外占用 1 个字节
据此我们可以得知 index_name_email 中的 name 和 email 字段都被使用了
8. ref
表示哪些列或常量被用于匹配用到的索引

9. rows
根据表统计信息及索引选用情况,估算出找到所需的记录所需要读取的行数,值越小越好,它不是结果集中的行数
10. filtered
表示某个表经过条件过滤之后,剩余记录条数的百分比
11. Extra
包含一些重要的额外信息
Using index:出现索引覆盖,即查询和检索条件的列都在使用的索引里面,不需要回表

Using where:不通过索引查询需要的数据
下例中 total_price 字段不存在索引

Using index condition:表示查询列不被索引覆盖,where 条件中是一个索引范围查找,过滤完索引后回表找到所有符合条件的数据行

Using filesort:当查询包含排序操作,又无法利用索引完成排序操作时,数据较少在内存排序,数据较多则在磁盘排序

Using temporary:在做如去重、排序和分组等功能时,如果不能有效利用索引,就需要建立临时表来完成

MySQL Explain 关键字详解的更多相关文章
- 转载:MySQL EXPLAIN 命令详解学习
转载自:https://blog.csdn.net/mchdba/article/details/9190771 MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查 ...
- MySQL EXPLAIN 命令详解
MySQL EXPLAIN 命令详解 MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP).这条命令的输出结果能够让我们了解MySQL 优化器是如何执行SQL 语句的.这条命令并没有提 ...
- 2.mysql explain命令详解
EXPLAIN详解 SQL编写和解析 编写过程 select-distinct-from-join-on-where-group by-having-order by-limit- 解析过程 from ...
- mysql explain参数详解
主要对几个参数做一些记录 type:显示的是访问类型 从最好到最差的连接类型为:const.eq_reg.ref.range.index和ALL 至少要达到range,基本是ref 最好是const ...
- mysql explain type详解
本文转载自最官方的 mysql explain type 字段解读 读了很多别人的笔记都杂乱不堪,很少有实例,什么都不如原装的好,所以当你读到我的笔记的时候如果觉得说的不明白,最好参考官方的手册. 我 ...
- mysql explain执行详解
1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询.2).select_type列常见的有:A:simple:表示不 ...
- mysql explain语法详解--优化你的查询
原文地址:http://blog.csdn.net/zhuxineli/article/details/14455029 explain显示了mysql如何使用索引来处理select语句以及连接表.可 ...
- MySQL Explain命令详解--表的读取顺序,数据读取操作的类型等
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) 不损失精确 ...
- MySQL EXPLAIN 命令详解学习
http://blog.csdn.net/mchdba/article/details/9190771
- mysql中文、英文别名排序问题,order by 关键字详解
order by 关键字详解: SELECT intcode AS 商品编码, product_title AS 名称, retailprice AS 零售价, purchaseprice AS ...
随机推荐
- Hologres揭秘:深度解析高效率分布式查询引擎
简介: 从阿里集团诞生到云上商业化,随着业务的发展和技术的演进,Hologres也在持续不断优化核心技术竞争力,为了让大家更加了解Hologres,我们计划持续推出Hologers底层技术原理揭秘系列 ...
- EDA 事件驱动架构与 EventBridge 二三事
简介: 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响.当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性.这里从我们熟 ...
- 记 dotnet 8.0.4 修复的 WPF 的触摸模块安全问题
本文记录 dotnet 8.0.4 版本修复的 WPF 的触摸模块安全问题,此问题影响所有的 .NET 版本,修复方法是更新 SDK 和运行时 宣布安全漏洞地址: https://github.com ...
- ESP32 分区表
当你编译程序,发现 app partition is too small for binary 错误的时候,就涉及到 ESP32 分区表的内容了. 一.基本概念 在了解分区之前,先了解一下以下概率,便 ...
- LabView十六进制与字符串之间的转换
一.准备工具 Labview开发软件 字符串与十六进制的转换工具(做测试使用) 在线转换工具:IEE754浮点数16进制转换 本地工具如下图所示: 二.LabView字符串转换为十六进制 在数值中选择 ...
- HarmonyOS 鸿蒙隔离层设计
在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升.新功能需求或安全性考虑等因素驱动.为了降低迁移成本,良好的设计模式至关重要. 在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进 ...
- SpringBoot-Http请求工具类
一.编写请求配置类 import com.alibaba.fastjson.JSONObject; import org.springframework.context.annotation.Conf ...
- anaconda安装cv2库
在安装cv2库之前,需要进行以下准备工作: 安装Anaconda 如果还没有安装Anaconda,可以在官网上下载对应操作系统的Anaconda安装包,然后按照提示进行安装.安装完成后,可以在终端中输 ...
- leaflet 在地图上创建marker标记
<!DOCTYPE html> <html> <head> <title>Layers Control Tutorial - Leaflet</t ...
- 安装node-sass失败原因及解决办法汇总
node-sass 安装过程 npm 拉下 node-sass包: 根据node版本和node-sass版本拉取对应的binding.node编译器,原因是sass的编译语言比较特殊,需要下载对应版本 ...