EXPLAIN Join Types

本文涉及的产品
PolarSearch,搜索节点 4核8GB
RDS AI 助手,专业版
PolarDB Agent Express,2核4GB
简介: `EXPLAIN` 输出的 `type` 列描述了表连接方式,从最优到最差包括:`system`(单行系统表)、`const`(最多一行,视为常量)、`eq_ref`(最佳连接类型,用于主键或唯一索引)、`ref`(基于索引的部分匹配)、`fulltext`(全文索引)、`ref_or_null`(包含 NULL 值的行)、`index_merge`(索引合并优化)、`unique_subquery` 和 `index_subquery`(索引查找替代子查询)、`range`(索引范围内检索)、`index`(索引扫描)、`ALL`(全表扫描,通常最差)。

EXPLAIN Output Format

image.png

EXPLAIN Join Types

EXPLAIN输出的type列描述了表是如何连接的。在JSON格式的输出中,这些是access_type属性的值。以下列表描述了连接类型,按从最佳类型到最差类型的顺序排列:

system

该表只有一行(=系统表)。这是const连接类型的一个特例。

const

该表最多有一个匹配行,在查询开始时读取。因为只有一行,所以该行列中的值可以被优化器的其余部分视为常量。const表非常快,因为它们只被读取一次。
const用于将PRIMARY KEY或UNIQUE索引的所有部分与常数值进行比较。在以下查询中,tbl_name可以用作const表:

image.png

eq_ref
对于前几张表中的每一行组合,都会从该表中读取一行。除了system和const类型之外,这是最好的连接类型。当连接使用索引的所有部分并且索引是PRIMARY KEY或UNIQUE NOT NULL索引时,使用它。
eq_ref可用于使用=运算符进行比较的索引列。比较值可以是常量,也可以是使用在此表之前读取的表中的列的表达式。在以下示例中,MySQL可以使用eq_ref连接来处理ref_table:

image.png

ref

对于前面表中的每一行组合,将从该表中读取具有匹配索引值的所有行。如果连接仅使用键的最左侧前缀,或者键不是PRIMARY key或UNIQUE索引(换句话说,如果连接无法根据键值选择单行),则使用ref。如果使用的键只匹配几行,则这是一种很好的连接类型。
ref可用于使用=或<=>运算符进行比较的索引列。在以下示例中,MySQL可以使用ref连接来处理ref_table:

image.png

fulltext
连接是使用FULLTEXT索引执行的。

ref_or_null
这种连接类型类似于ref,但MySQL会额外搜索包含NULL值的行。这种连接类型优化最常用于解决子查询。在以下示例中,MySQL可以使用ref_or_null连接来处理ref_table:

image.png

See Section 8.2.1.13, “IS NULL Optimization”.

index_merge

此连接类型表示使用了索引合并优化。在这种情况下,输出行中的键列包含所使用的索引列表,key_len包含所使用索引的最长键部分列表。有关更多信息,请参阅第8.2.1.3节“索引合并优化”。

unique_subquery

此类型替换以下形式的某些IN子查询的eq_ref:

image.png

unique_subquery只是一个索引查找函数,它完全替换了子查询以提高效率。

index_subquery
此连接类型类似于unique_subquery。它取代了IN子查询,但它适用于以下形式的子查询中的非唯一索引:

image.png

range

使用索引选择行,只检索给定范围内的行。输出行中的键列指示使用了哪个索引。key_len包含所使用的最长键部分。此类型的ref列为NULL。

当使用=、<>、>、>=、<、<=、is NULL、<=>、BETWEEN、LIKE或IN()运算符中的任何一个将键列与常量进行比较时,可以使用range:

image.png

index
索引联接类型与ALL相同,只是扫描了索引树。这有两种方式:
如果索引是查询的覆盖索引,并且可用于满足表中所需的所有数据,则只扫描索引树。在这种情况下,Extra列显示正在使用索引。仅索引扫描通常比ALL更快,因为索引的大小通常小于表数据。
使用从索引中读取的数据按索引顺序查找数据行来执行全表扫描。使用索引不会出现在“额外”列中。
当查询仅使用单个索引中的列时,MySQL可以使用此联接类型。

ALL
对前面表中的每一行组合进行全表扫描。如果表是第一个未标记为const的表,这通常是不好的,在所有其他情况下通常都是非常糟糕的。通常,您可以通过添加索引来避免ALL,这些索引允许根据早期表中的常量值或列值从表中检索行。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
Java 中间件 数据库连接
分库分表的4种方案
分库分表的4种方案
2505 0
|
测试技术
JMeter 随机数生成器详细指南:利用 Random 和 UUID 实现
在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。
|
存储 开发工具 git
Vscode 拉取代码时出现 在签出前 请先清理仓库工作树
Vscode 拉取代码时出现 在签出前 请先清理仓库工作树
3785 0
|
2月前
|
人工智能 数据挖掘 语音技术
5个AI Skill实测:影视内容创作全流程自动化
AI能力上限取决于装了什么Skill!本文推荐影视博主必装5大技能:热点选题、AI解说视频、智能字幕、数据复盘、多平台发布,覆盖创作全流程,30分钟搞定原需4-5小时的工作,效率跃升10倍。(239字)
|
2月前
|
Oracle IDE Java
【全网最详细】JDK下载安装图文教程 | Java JDK开发环境搭建指南
JDK是Java开发核心工具包,含编译器、运行环境等。主流有Oracle JDK(商用需授权)和开源免费的OpenJDK。推荐初学者选用LTS版如JDK 17或21,稳定且长期支持。安装后需配置JAVA_HOME与PATH环境变量,并通过`java -version`验证。(239字)
|
9月前
|
SQL 安全 PHP
SQL注入-下篇
本文介绍了HTTP注入中的Referer和Cookies注入原理与实操步骤,演示了通过SQL注入获取数据库信息及webShell的方法,并涵盖pikachu靶场搭建、DNSLog盲注等内容,帮助理解常见Web安全漏洞及其利用方式。
716 0
SQL注入-下篇
|
人工智能 JavaScript 前端开发
Vue 性能革命:揭秘前端优化的终极技巧;Vue优化技巧,解决Vue项目卡顿问题
Vue在处理少量数据和有限dom的情况下技术已经非常成熟了,但现在随着AI时代的到来,海量数据场景会越来越多,Vue优化技巧也是必备技能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
Serverless
数学建模——确定性时间序列分析方法(一)
数学建模——确定性时间序列分析方法
675 0
|
存储 缓存 算法
JDK11升级后竟让内存利用率飙升到90%以上?
JDK11升级后竟让内存利用率飙升到90%以上?