explain详解
迪丽瓦拉
2025-05-29 00:01:57
0

一、explain输出列

ColumnMeaning意义
idThe identifierSELECTSELECT的序列号
select_typeThe typeSELECTSELECT的类型
tableThe table for the output row输出行的表
partitionsThe matching partitions匹配的分区
typeThe join type联接类型
possible_keysThe possible indexes to choose供选择的可能索引
keyThe index actually chosen实际选择的索引
key_lenThe length of the chosen key所选键的长度
refThe columns compared to the index与索引比较的列
rowsEstimate of rows to be examined要检查的行的估计值
filteredPercentage of rows filtered by table condition按表条件筛选的行百分比
ExtraAdditional information其他信息

二、输出列详解

1.id

SELECT的序列号。

2.select_type

select_typeValueMeaning意义
SIMPLESimple SELECT(not using UNION or subqueries)简单SELECT(未使用UNION或子查询)
PRIMARYOutermost SELECT最外层SELECT
UNIONSecond or later SELECT statement in a UNIONUNION中的第二个或后面的SELECT语句
DEPENDENT UNIONSecond or later SELECT statement in a UNION, dependent on outer queryUNION中的第二个或后面的SELECT语句,取决于外部查询
UNION RESULTResult of a UNIONUNION的结果
SUBQUERYFirst SELECT in subquery子查询中的第一个SELECT
DEPENDENT SUBQUERYFirst SELECT in subquery, dependent on outer query子查询中的第一个SELECT,取决于外部查询
DERIVEDDerived table派生表
DEPENDENT DERIVEDDerived table dependent on another table依赖于另一个表的派生表
MATERIALIZEDMaterialized subquery具体化子查询
UNCACHEABLE SUBQUERYA subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query无法缓存其结果且必须为外部查询的每一行重新求值的子查询
UNCACHEABLE UNIONThe second or later SELECT in a UNION that belongs to an uncacheable subqueryUNION中属于不可缓存子查询的第二个或后面的SELECT

3.table

输出行引用的表的名称,也可以是以下值之一:

:M和N的行的并集。

:值为N的行的派生表结果。例如,来自子句中的子查询。

:值为N的行的实例化子查询的结果。

4.partitions

查询将从中匹配记录的分区。该值用于未分区的表。

5.type

以下列表描述了联接类型,从最佳类型到最差类型排序:

typeValue意义
system该表只有一行(=系统表)。这是常量联接类型的特殊情况。
const该表最多有一个匹配行,在查询开始时读取该行。因为只有一行,所以优化器的其他部分可以将该行中列的值视为常量。常量表非常快,因为它们只读取一次。
const用于将PRIMARY KEYUNIQUE索引的所有部分与常量值进行比较。在以下查询中,tbl_name可以用作常量表:
SELECT * FROM tbl_name WHERE primary_key=1;
SELECT * FROM tbl_name WHERE primary_key_part1=1 AND primary_key_part2=2;
eq_ref对于上一个表中的每一行组合,将从该表中读取一行。除了系统类型和常量类型之外,这是最好的联接类型。当连接使用索引的所有部分,并且索引是PRIMARY KEYUNIQUE NOT NULL索引时,使用该方法。
eq_ref可用于使用=运算符进行比较的索引列。比较值可以是常量,也可以是使用在此表之前读取的表中的列的表达式。在以下示例中,MySQL可以使用eq_ref连接来处理ref_table
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
ref对于上一个表中的每一行组合,将从该表中读取具有匹配索引值的所有行。如果联接仅使用键的最左边前缀,或者键不是PRIMARY keyUNIQUE索引(换句话说,如果联接无法根据键值选择单行),则使用ref。如果所使用的键仅与少数行匹配,则这是一种良好的联接类型。
ref可用于使用=或<=>运算符进行比较的索引列。在以下示例中,MySQL可以使用ref联接来处理ref_table
SELECT * FROM ref_table WHERE key_column=expr;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column=other_table.column;
SELECT * FROM ref_table,other_table WHERE ref_table.key_column_part1=other_table.column AND ref_table.key_column_part2=1;
fulltext使用FULLTEXT索引执行联接。
ref_or_null这种联接类型类似于ref,但MySQL会额外搜索包含NULL值的行。这种联接类型优化最常用于解析子查询。在以下示例中,MySQL可以使用ref_or_null连接来处理ref_table
SELECT * FROM ref_table WHERE key_column=expr OR key_column IS NULL;
index_merge此联接类型表示使用了索引合并优化。在这种情况下,输出行中的键列包含使用的索引列表,而key_len包含使用索引的最长键部分列表。
unique_subquery此类型替换以下形式的某些IN子查询的eq_ref
value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery只是一个索引查找函数,它完全替换了子查询以提高效率。
index_subquery此联接类型类似于unique_subquery。它替代了IN子查询,但它适用于以下形式的子查询中的非唯一索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range仅检索给定范围内的行,使用索引选择行。输出行中的键列指示使用的索引。key_len包含所使用的最长密钥部分。此类型的ref列为NULL
当使用 =、<>、>、>=、<、<=、is NULL、<=>、BETWEEN、LIKE或IN()运算符 将键列与常量进行比较时,可以使用range
SELECT * FROM tbl_name WHERE key_column = 10;
SELECT * FROM tbl_name WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
index索引连接类型与ALL相同,只是扫描了索引树。这有两种方式:
·如果索引是查询的覆盖索引,并且可以用于满足表中所需的所有数据,则只扫描索引树。在本例中,Extra列显示Using index。仅索引扫描通常比ALL更快,因为索引的大小通常小于表数据。
·使用从索引中读取来执行全表扫描,以按索引顺序查找数据行。Uses index会显示在Extra列中。
当查询仅使用作为单个索引一部分的列时,MySQL可以使用此联接类型。
ALL对前一个表中的每一行组合进行全表扫描。如果该表是第一个未标记为const的表,这通常是不好的,并且在所有其他情况下通常是非常糟糕的。通常,您可以通过添加索引来避免ALL,该索引允许基于以前表中的常量值或列值从表中检索行。

6.possible_keys

供选择的可能索引。

7.key

实际使用的键(索引)。

8.key_len

使用的索引长度。

9.ref

该列表示将哪些列或常量与索引进行比较,以从表中选择行。

10.rows

MySQL认为执行查询必须检查的行数。对于InnoDB表,该数字只是估计值,并不总是准确的。

11.filtered

由表条件筛选的行的估计百分比。最大值100,意味着没有对行进行筛选。值从100减少表示过滤量增加。

12.Extra

其他信息。更多Extra信息请参考MYSQL官方手册。

附:MYSQL官方手册-EXPLAIN

MySQL :: MySQL 8.0 Reference Manual :: 8.8.2 EXPLAIN Output Format

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...