MySQL优化器的SQL重写规则

MySQL优化器的SQL重写规则

MySQL优化器的SQL重写规则:MySQL优化器会根据一定的规则对输入的SQL在保证含义不变的情况下进行SQL的优化重写。

1. 条件简化

1.1 移除不必要的括号

例如:

((a = 5 AND b =c) OR ((a > c) AND (c < 5)));
--优化后
(a = 5 and b =c) OR (a > c AND c < 5)
1.2 常量传递

例如:

a = 5 AND b >a;
--优化后
a = 5 AND b >5;  
1.3 等值传递

例如:

a = b and b = c and c = 5;
--优化后
a = 5 and b = 5 and c = 5;
1.4 移除没用的条件

例如:

a < 1 and b= b;
-- 优化后
a < 1;
1.5 表达式计算

例如:

a = 1 + 1;
--优化后
a = 2;

但是对于复杂的无法优化,例如:

-a < -8;
max(a) > 8;
1.6 常量表检测

在使用主键索引或则唯一性的二级索引进行等值匹配时候,MySql认为查询耗时很少,可以忽略。因此MySQL将这种条件的查询作为一个常量表来处理。优化器在分析一个查询语句时,先首先执行常量表查询,然后把查询中涉及到该表的条件全部替换成常数,最后再分析其余表的查询成本。例如:

select *
from table1 aleft join table2 bon a.id = b.id
whereand a.id = 1;

这个查询可以使用主键和常量值的等值匹配来查询table1表,也就是在这个查询中table1表相当于常量表,在分析对table2表的查询成本之前,就会执行对table1表的查询,并把查询中涉及table1表的条件都替换掉:

SELECT table1表记录的各个字段的常量值,table2.*
FROM table1INNER JOIN table2 ON table2.a = 1;
1.7 外连接消除

内连接的驱动表和被驱动表的位置可以相互转换,而外连接的驱动表和被驱动表是固定的。这就导致内连接可能通过优化表的连接顺序来降低整体的查询成本,而外连接却无法优化表的连接顺序。

如果外连接查询的列行数和内连接查询的行数相同,即查询内容相同,也就是说外连接中驱动表没有多余的列,那么MySQL就会将外连接转换为内连接来执行SQL,这就是外连接消除。

1.8 子查询优化
1.8.1 子查询类型
  1. 按返回的结果集区分子查询,子查询分为以下几种:
  1. 标量子查询:那些只返回一个单一值的子查询称之为标量子查询。
  2. 行子查询:就是返回一条记录的子查询,不过这条记录需要包含多个列(只包含一个列就成了标量子查询了)。
  3. 列子查询:列子查询自然就是查询出一个列的数据,不过这个列的数据需要包含多条记录(只包含一条记录就成了标量子查询了)。
  4. 表子查询:就是子查询的结果既包含很多条记录,又包含很多个列。
  1. 按与外层查询关系来区分子查询,可分为:
  1. 不相关子查询:如果子查询可以单独运行出结果,而不依赖于外层查询的值,我们就可以把这个子查询称之为不相关子查询。
  2. 相关子查询:如果子查询的执行需要依赖于外层查询的值,我们就可以把这个子查询称之为相关子查询,比如:SELECT * FROM e1 WHERE m1 IN (SELECT m2 FROM e2 WHERE n1 = n2);
  1. [NOT] IN/ANY/SOME/ALL子查询

    对于列子查询和表子查询来说,它们的结果集中包含很多条记录,这些记录相当于是一个集合,所以就不能单纯的和另外一个操作数使用操作符来组成布尔表达式了,MySQL通过下面的语法来支持某个操作数和一个集合组成一个布尔表达式。

  1. IN或者NOT IN:例如:SELECT * FROM e1 WHERE (m1, n1) IN (SELECT m2, n2 FROM e2);
  2. ANY/SOME:例如:SELECT * FROM e1 WHERE m1 > ANY(SELECT m2 FROM e2);等价于SELECT * FROM e1 WHERE m1 > (SELECT MIN(m2) FROM e2);
  3. ALL:例如:SELECT * FROM e1 WHERE m1 > ALL(SELECT m2 FROM e2);等价于SELECT * FROM e1 WHERE m1 > (SELECT MAX(m2) FROM e2);
  4. EXISTS子查询:例如SELECT * FROM e1 WHERE EXISTS (SELECT 1 FROM e2);
1.8.2 子查询优化
  1. 标量子查询、行子查询的执行方式
  1. 对于不相关标量子查询或者行子查询来说,先单独执行子查询,然后将子查询结果作为条件执行外出查询,也就是说,分别执行外层查询和子查询,两个单表操作。
  2. 对于相关的标量子查询或者行子查询来说,先从外层查询取出一条数据,然后将某列作为条件去匹配子查询,如果成立放入结果集,如果不成立,舍弃。
  1. 物化表
  1. 对于行子查询或表子查询来说,子查询返回的结果集不止一条,外层去匹配子查询结果集效率极低。那么MySQL采用临时表的解决方法,该临时表的列就是子查询结果集中的列,也就是物化表。
  2. 物化表建立方式:写入临时表的记录会被去重,临时表也是个表,只要为表中记录的所有列建立主键或者唯一索引。一般情况下子查询结果集不会大的离谱,所以会为它建立基于内存的使用Memory存储引擎的临时表,而且会为该表建立哈希索引。如果子查询的结果集非常大,超过了系统变量tmp_table_size或者max_heap_table_size,临时表会转而使用基于磁盘的存储引擎来保存结果集中的记录,索引类型也对应转变为B+树索引。
  1. 物化表转连接

所谓物化表转连接,就是外层表和物化表做连接查询,MySQL通过计算外层表作为驱动表和物化表作为驱动表进行连接查询的查询成本,然后使用成本较低的方式进行查询。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/845795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构与算法(C 语言)】栈的基本操作函数(动图演示) 及 栈的实际应用之一:进制转换

目录 1. 前言2. 结构及基本操作函数&#xff1a;2.1 栈的结构类型 Stack2.2 初始化栈 InitStack2.3 销毁栈 DestroyStack2.4 清空栈 ClearStack2.5 判断栈是否为空 StackEmpty2.6 获取stack的长度 StackLength2.7 获取栈顶元素 GetTop2.8 入栈 Push2.9 出栈 Pop2.10 访问元素2.…

COLING 2024: 复旦发布AoR,层级聚合推理突破大模型复杂推理上限

“三个臭皮匠&#xff0c;顶个诸葛亮&#xff1f;” “一个模型不行&#xff0c;那就再堆一个&#xff1f;” 过去当我们在处理复杂任务的时候&#xff0c;往往会考虑集成策略&#xff08;Ensembling Strategy&#xff09;&#xff0c;通过多个模型投票的方式&#xff0c;选出…

SSL 、IPSec、MPLS和SD-WAN的对比分析

VPN类型 实现方式 应用场景 优势 SSL VPN 基于SSL/TLS协议 传输层加密 远程访问企业 内部资源 易于部署和管理 无需额外客户端 IPSec VPN 基于IPsec协议 网络层加密 站点到站点和远程访问 强大的加密和认证机制 MPLS VPN 基于MPLS技术 标签转发 企业站点间连接…

图形学初识--屏幕空间变换

文章目录 前言正文为什么需要屏幕空间变换&#xff1f;什么是屏幕空间变换&#xff1f;屏幕空间变换矩阵如何推导&#xff1f;问题描述步骤描述 结尾&#xff1a;喜欢的小伙伴点点关注赞哦! 前言 前面章节主要讲解了视图变换和投影变换&#xff0c;此时距离在屏幕空间显示也就…

alexnet模型_图像分类算法对动物有无斑纹识别-不含数据集图片-含逐行注释和说明文档

alexnet模型_图像分类算法对动物有无斑纹识别-不含数据集图片-含逐行注释和说明文档 代码下载地址&#xff1a; https://download.csdn.net/download/qq_34904125/89357170 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个环境安装的requirement.txt…

广告变现是什么

广告变现是指媒体或平台通过向用户展示广告主的广告&#xff0c;从而获得收入的过程。 广告变现就像是一个店主&#xff0c;他需要有一个吸引人的店面&#xff0c;提供优质的内容和服务&#xff0c;然后在店里摆放一些别人的商品或服务&#xff0c;每当有客人看了或买了这…

量化研究---强大的可转债分析系统上线,提供api,实时数据支持

今天把可转债实盘的分析模型拿出来&#xff0c;放在服务器方便选股分析&#xff0c;方便后面对接大qmt直接选股交易 强大的禄得可转债自定义因子轮动系统完成&#xff0c;可转债三低为例子 自定义因子实盘的框架 自定义因子轮动框架非常强大 网页 http://120.78.132.143:8023/…

如何保障网络稳定与业务连续性?

在现代企业中&#xff0c;网络是关键的基础设施之一&#xff0c;确保网络稳定和业务连续性是IT运维的重要职责。一个有效的网络流量监控系统能够帮助企业实时了解网络状况&#xff0c;快速发现和解决问题&#xff0c;从而提高整体运营效率。本文将深入探讨企业网络流量监控的重…

python上位机串行通信接收字节数据的校验处理-以crc16-modbus为例

在串行通信中&#xff0c;接收到的数据是否正确&#xff0c;一般用CRC校码的方式来完成。上位机向下位机发送数据时&#xff0c;需要加上校验码&#xff0c;同理&#xff0c;下位机向上位机上报数据时&#xff0c;也需要加上校验码。 校验码的计算方法有很多&#xff0c;比较简…

C# WinForm —— 23 Timers.Timer 组件介绍与使用

1. 简介 System.Timers.Timer 计时器 轻量 每隔一段时间触发Elapsed事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也不会造成 UI 失去响应 如果要获取服务器的计时功能的话&#xff0c;可以使用System.Timers.Timer …

PLC电脑编程软件怎么下?详细指南与技巧解析

PLC电脑编程软件怎么下&#xff1f;详细指南与技巧解析 在工业自动化领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;扮演着至关重要的角色。为了对PLC进行编程和调试&#xff0c;我们需要使用专门的PLC电脑编程软件。本文将详细介绍如何下载并安装这些软件&…

轻松记录收支明细,智能筛选并统计买菜历史记录:一键掌握家庭财务

在繁忙的生活中&#xff0c;你是否曾为家庭财务的琐碎而烦恼&#xff1f;买菜、购物、日常开销……每一笔支出都似乎难以捉摸&#xff0c;让你在月底对账时头疼不已。现在&#xff0c;我们为你带来了一款全新的财务记录工具&#xff0c;让你轻松记录收支明细&#xff0c;智能筛…

2024华为OD机试真题-推荐多样性-C卷D卷-200分-(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略: 各个列表元素需要做穿插处理,即先从第一个…

关于如何在Arch Linux上编写自己的第一个module

前一段时间一直想深入学习编写一个module插入到自己的内核当中&#xff0c;但是网上的资料基本上全都针对的Ubuntu和Debian等流行的Linux发行版&#xff0c;这里打算简单的记录一波博客。 啥是Module?(着急可不看) 众所周知&#xff1a;现代宏内核架构的操作系统都会借鉴微内核…

C语言| 100元换成50元、20元、10元有几种方案?

/* 求出用50元、20元和10元换算100元有几种方式&#xff1f; 100元可以换两张50元&#xff0c;可以换5张20元&#xff0c;可以换10张10元。 用到for循环去实现&#xff0c;换算的最大范围分别是2 5 10 最中间再嵌套一个if&#xff0c;利用100 50*wushi20*ershi10*shi判断&a…

crbug/1173575

需要新建一个前端工程&#xff0c;前端人员从之前的一个工程复制过来&#xff0c;修改了端口号&#xff0c;删除了不适合的代码&#xff0c;打算从空工程开始开发。一切顺利&#xff0c;npm run dev&#xff0c;访问浏览器&#xff0c;结果页面出不来。怀疑删除了不该删除的文件…

Kotlin使用Dagger2但无法生成对应类 Unresolved reference: DaggerMyComponent

Dagger2无法生成对应类 Unresolved reference: DaggerMyComponent 解决&#xff1a; 在gradle.properties中设置 kapt.incremental.apt false参考链接&#xff1a; https://www.jianshu.com/p/f79003a5e6ba

vcruntime140.dll丢失如何安装,附找不到vcruntime140.dll的六种解决方法

vcruntime140.dll是一个动态链接库文件&#xff0c;属于Microsoft Visual C Redistributable Packages的一部分&#xff0c;专为Visual Studio 2015开发环境设计。它提供了C运行时库&#xff08;CRT&#xff09;中的一些关键功能&#xff0c;以及一些额外的Microsoft特定的运行…

0基础前端理论:揭开网页构建与交互的奥秘

0基础前端理论&#xff1a;揭开网页构建与交互的奥秘 在数字化时代&#xff0c;前端技术已经成为构建现代网页和应用程序不可或缺的一部分。对于零基础的学习者来说&#xff0c;理解前端理论是迈向成功的关键一步。本文将从四个方面、五个方面、六个方面和七个方面深入探讨0基…

【数据库系统原理】函数依赖与范式

在数据库设计中&#xff0c;范式&#xff08;Normal Forms, NF&#xff09;是用来规范化数据库表结构&#xff0c;以减少冗余数据和提高数据一致性与完整性的重要工具。 函数依赖 完全函数依赖与部分函数依赖 完全函数依赖 定义&#xff1a; 完全函数依赖表示的是在一个关系…