EXPLAIN Output Interpretation

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 通过分析`EXPLAIN`输出的行列乘积,可评估MySQL连接效率,估算查询所需检查的行数。该乘积还影响`max-join-size`系统变量对多表SELECT语句的执行与中止决策。示例展示了如何逐步优化多表连接,通过调整列类型和大小来减少行乘积,从而提高查询性能。最终,结合索引分析,实现更优的连接效果。

EXPLAIN Output Format

image.png

EXPLAIN Output Interpretation

通过获取EXPLAIN输出的行列中的值的乘积,可以很好地指示连接有多好。这应该大致告诉您MySQL必须检查多少行才能执行查询。
如果使用max-join_size系统变量限制查询,则此行乘积还用于确定执行哪些多表SELECT语句以及中止哪些语句。请参阅第5.1.1节“配置服务器”。
以下示例显示了如何根据EXPLAIN提供的信息逐步优化多表连接。
假设您有此处显示的SELECT语句,并且您计划使用EXPLAIN对其进行检查:

image.png

For this example, make the following assumptions:

The columns being compared have been declared as follows.

image.png

最初,在执行任何优化之前,EXPLAIN语句会生成以下信息:

image.png

因为每个表的类型都是ALL,所以此输出表示MySQL正在生成所有表的笛卡尔积;即每一行的组合。这需要相当长的时间,因为必须检查每个表中行数的乘积。对于手头的案例,该产品为74×2135×74×3872=45268558720行。如果桌子更大,你只能想象需要多长时间。
这里的一个问题是,如果列被声明为相同的类型和大小,MySQL可以更有效地在列上使用索引。在这种情况下,如果VARCHAR和CHAR被声明为相同的大小,则它们被认为是相同的。tt.Actical PC被声明为CHAR(10),et.EMPLOYID为CHAR,因此存在长度不匹配。
要修复列长度之间的差异,请使用ALTER TABLE将ActualPC从10个字符延长到15个字符:

image.png

现在tt.AactualPC和et.MPLOYID都是VARCHAR(15)。再次执行EXPLAIN语句会产生以下结果:

image.png

这并不完美,但要好得多:行值的乘积减少了74倍。此版本将在几秒钟内执行。
可以进行第二次更改,以消除tt.AssignedPC=et_1.EMPLOYID和tt.ClientID=do.CUSTNMBR比较的列长度不匹配:
image.png

After that modification, EXPLAIN produces the output shown here:

image.png

此时,查询几乎尽可能地优化了。剩下的问题是,默认情况下,MySQL假设tt.ActualPC列中的值是均匀分布的,而tt表则不是这样。幸运的是,告诉MySQL分析密钥分布很容易:
image.png

With the additional index information, the join is perfect and EXPLAIN produces this result:

image.png

EXPLAIN输出中的行列是MySQL连接优化器的一个有根据的猜测。通过将行乘积与查询返回的实际行数进行比较,检查这些数字是否接近真实值。如果数字相差很大,在SELECT语句中使用STRIGHT_JOIN并尝试在FROM子句中以不同的顺序列出表,可能会获得更好的性能。(但是,STRIGHT_JOIN可能会阻止使用索引,因为它禁用了半连接转换。请参阅第8.2.2.1节“使用半连接转换优化子查询、派生表和视图引用”。)
在某些情况下,当EXPLAIN SELECT与子查询一起使用时,可以执行修改数据的语句;有关更多信息,请参阅第13.2.10.8节“衍生表”。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
机器学习/深度学习 存储 算法
竞争学习原理与策略| 学习笔记
快速学习竞争学习原理与策略。
竞争学习原理与策略| 学习笔记
|
3月前
|
存储 Kubernetes Docker
部署eck收集日志到k8s
本文介绍基于ECK(Elastic Cloud on Kubernetes)在K8s中部署Elasticsearch、Kibana和Filebeat的完整流程。采用Helm方式部署ECK Operator,通过自定义YAML文件分别部署ES集群、Kibana及Filebeat,并实现日志采集与可视化。重点涵盖命名空间一致性、版本匹配、HTTPS配置禁用、资源限制、存储挂载及权限RBAC设置,支持系统日志、应用日志与容器日志的多源采集,适用于生产环境日志系统搭建。
741 94
|
7月前
|
虚拟化 iOS开发 MacOS
VMware ESXi 9.0.0.0100 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
VMware ESXi 9.0.0.0100 macOS Unlocker & OEM BIOS 2.7 集成网卡驱动和 NVMe 驱动 (集成驱动版)
1200 1
|
10月前
|
传感器 人工智能 搜索推荐
教育随身而行——可穿戴设备如何赋能未来课堂?
教育随身而行——可穿戴设备如何赋能未来课堂?
297 16
|
机器学习/深度学习 人工智能 搜索推荐
人工智能与未来医疗:AI技术如何重塑医疗健康领域###
【10月更文挑战第21天】 一场由AI驱动的医疗革命正在悄然发生,它以前所未有的速度和深度改变着我们对于疾病预防、诊断、治疗及健康管理的认知。本文探讨了AI在医疗领域的多维度应用,包括精准医疗、药物研发加速、远程医疗普及以及患者个性化治疗体验的提升,揭示了这场技术变革背后的深远意义与挑战。 ###
790 6
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
585 3
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
985 0
|
安全 网络协议 Linux
【Windows】已解决:修改本地host文件异常的正确解决方法
【Windows】已解决:修改本地host文件异常的正确解决方法
2359 0
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
259 2
|
存储 数据采集 运维
日志服务(SLS)使用体验
通过参加配置SLS来实现Nginx日志的采集的实验,以及参与了数据洞察创新挑战赛之智能运维赛,来谈谈自己的体验感受。
2022 55