当前位置: 首页 > news >正文

【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化

主博客:

【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客

上一篇:

【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客

下一篇:

【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化-CSDN博客


查询时FROM子句中的表达式在许多情况下都得到了简化。

在解析器阶段,具有右外部联接操作的查询被转换为仅包含左联接操作的等效查询。

在一般情况下,执行转换时,此右联接:

(T1, ...) RIGHT JOIN (T2, ...) ON P(T1, ..., T2, ...)

 成为此等效的左联接:

(T2, ...) LEFT JOIN (T1, ...) ON P(T1, ..., T2, ...)

形式为T1 inner join T2 ON P(T1,T2)的所有内部联接表达式被作为联接到WHERE条件(或嵌入联接的联接条件,如果有的话)表达式 T1,T2,P(T1、T2)所代替。

当优化器评估外部联接操作的计划时,它只考虑这样的计划,即对于每个这样的操作,外部表在内部表之前被访问。优化器的选择是有限的,因为只有这样的计划才能使用嵌套循环算法执行外部联接。

考虑这种形式的查询,其中R(T2)极大地缩小了表T2中匹配行的数量:

SELECT * T1 FROM T1LEFT JOIN T2 ON P1(T1,T2)WHERE P(T1,T2) AND R(T2)

如果按写入的方式执行查询,则优化器别无选择,只能在更受限制的表T2之前访问限制较少的表T1,这可能会产生非常低效的执行计划

相反,如果拒绝WHERE条件为null,MySQL会将查询转换为不包含外部联接操作的查询。(也就是说,它将外部联接转换为内部联接。)如果为外部联接操作生成的任何NULL补齐行的条件计算结果为FALSE或UNKNOWN,则称该条件为NULL拒绝。

因此,对于这种外部连接:

T1 LEFT JOIN T2 ON T1.A=T2.A

 此类条件被拒绝为null,因为它们对于任何NULL补齐行(T2列设置为null)都不能为true:

T2.B IS NOT NULL
T2.B > 3
T2.C <= T1.C
T2.B < 2 OR T2.C > 1

 这样的条件不会被NULL拒绝,因为它们对于NULL补齐行可能为true:

T2.B IS NULL
T1.B < 3 OR T2.B IS NOT NULL
T1.B < 3 OR T2.B > 3

 检查条件是否为null的一般规则对于外部联接操作是拒绝的,这些规则很简单:

1.它的形式为A IS NOT NULL,其中A是任何内部表的属性

2.它是一个断言,包含对内部表的引用,当其中一个参数为NULL时,该表的计算结果为UNKNOWN

3.它是一个连词,包含一个空拒绝条件作为连词

4.它是空拒绝条件的变体

对于查询中的一个外部联接操作,条件可以为NULL拒绝,而对于另一个,条件不能为NULL拒绝。在这个查询中,WHERE条件对于第二个外部联接操作是NULL拒绝的,但是对于第一个操作不是NULL拒绝的:

SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.ALEFT JOIN T3 ON T3.B=T1.BWHERE T3.C > 0

如果查询中的外部联接操作拒绝WHERE条件为null,则外部联接操作将替换为内部联接操作。

例如,在前面的查询中,第二个外部联接被null拒绝,可以用内部联接代替:

SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.AINNER JOIN T3 ON T3.B=T1.BWHERE T3.C > 0

 对于原始查询,优化器仅评估与单表访问顺序T1、T2、T3兼容的计划。对于重写的查询,它另外考虑访问顺序T3、T1、T2。

一个外部联接操作的转换可能会触发另一个的转换。因此,查询:

SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.ALEFT JOIN T3 ON T3.B=T2.BWHERE T3.C > 0

 首先转换为查询:

SELECT * FROM T1 LEFT JOIN T2 ON T2.A=T1.AINNER JOIN T3 ON T3.B=T2.BWHERE T3.C > 0

 这相当于查询:

SELECT * FROM (T1 LEFT JOIN T2 ON T2.A=T1.A), T3WHERE T3.C > 0 AND T3.B=T2.B

 剩余的外部联接操作也可以由内部联接代替,因为条件T3.B=T2.B为空被拒绝。这将导致一个根本没有外部联接的查询:

SELECT * FROM (T1 INNER JOIN T2 ON T2.A=T1.A), T3WHERE T3.C > 0 AND T3.B=T2.B

 有时,优化器成功地替换了嵌入的外部联接操作,但无法转换嵌入的外部连接。以下查询:

SELECT * FROM T1 LEFT JOIN(T2 LEFT JOIN T3 ON T3.B=T2.B)ON T2.A=T1.AWHERE T3.C > 0

 转换为:

SELECT * FROM T1 LEFT JOIN(T2 INNER JOIN T3 ON T3.B=T2.B)ON T2.A=T1.AWHERE T3.C > 0

 只能重写为仍包含嵌入外部联接操作的形式:

SELECT * FROM T1 LEFT JOIN(T2,T3)ON (T2.A=T1.A AND T3.B=T2.B)WHERE T3.C > 0

任何转换查询中嵌入外部联接操作的尝试都必须将嵌入外部联接的联接条件与WHERE条件一起考虑在内。在该查询中,嵌入的外部联接的WHERE条件不是null拒绝,而是嵌入的外部连接的联接条件T2.A=T1.A AND T3.C=T1.C是null拒绝:

SELECT * FROM T1 LEFT JOIN(T2 LEFT JOIN T3 ON T3.B=T2.B)ON T2.A=T1.A AND T3.C=T1.CWHERE T3.D > 0 OR T1.D > 0

 因此,查询可以转换为:

SELECT * FROM T1 LEFT JOIN(T2, T3)ON T2.A=T1.A AND T3.C=T1.C AND T3.B=T2.BWHERE T3.D > 0 OR T1.D > 0

相关文章:

【MySQL精通之路】SQL优化(1)-查询优化(10)-外部联接简化

主博客&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化-CSDN博客 上一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(9)-外部联接优化-CSDN博客 下一篇&#xff1a; 【MySQL精通之路】SQL优化(1)-查询优化(11)-多范围查询优化-CSDN博客 查询时FROM子句中的表达…...

SCT2360:4V-28v Vin,6A同步降压DCDC转换器与EMI减少

特点&#xff1a; 宽4V-28V输入电压范围 0.6V14V输出电压范围 6A连续输出电流 HS/LS电源的集成式36m2/18m2 Rdson MOSFET 固定1 ms软启动时间 可选择的400KHz&#xff0c;800KHz&#xff0c;1.2MHz开关频率 可选择的PWM、PFM和USM操作模式 逐周期电流限制 输出过电压保护 超温保…...

企微运营SOP:构建高效、规范的运营流程

随着企业微信在企业内部沟通协作中的广泛应用&#xff0c;如何构建一套高效、规范的企微运营流程成为了众多企业关注的焦点。本文将详细探讨企微运营SOP&#xff08;Standard Operating Procedure&#xff0c;标准操作程序&#xff09;的重要性、构建方法以及实施效果&#xff…...

<商务世界>《76 微课堂<茶叶(2)-种类>》

1 茶叶总共分为6个大类 六大茶类分类法&#xff1a;红茶、绿茶、青茶、黄茶、黑茶、白茶六大茶类 2 红茶 红茶具有红茶、红汤、红叶和香甜味醇的特征。以水冲泡&#xff0c;不仅香气迎人&#xff0c;还呈现出特有的深红茶色&#xff0c;因此被人称为“红茶”。 分布地区&…...

安卓Bug总结

为什么写这篇文章 安卓十年开发遇到过得Bug做一个总结&#xff0c;大同小异&#xff0c;总结教训。 这里存放BUG目录列表 文章列表内容关键字Gradle常见问题及总结包括以下问题&#xff1a;gradle插件与gradle home版本关系错误、Gradle下载太慢、Executionfailed forJetifyTr…...

基于小波分析和机器学习(SVM,KNN,NB,MLP)的癫痫脑电图检测(MATLAB环境)

癫痫是一种由大脑神经元突发性异常放电导致的大脑功能性障碍疾病。据世界卫生组织统计&#xff0c;全球约有7000万人患有癫痫。癫痫患者在发病时呈现肌肉抽搐、呼吸困难、意识丧失等症状。由于癫痫发作的偶然性&#xff0c;患者极有可能在高空、驾驶、游泳等危险情况下发病并丧…...

python数据分析:爬取某东商城商品评论数据并做词云展示(含完整源码及详细注解)

python数据分析,爬取某东商城商品评论数据并做词云展示。 一、明确爬取的网页及结构 找到要爬取的网页地址,发现有一个获取json格式评论数据的接口: url = "https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=217…...

当HR问你是否单身时,该怎么回答?

知识星球&#xff08;星球名&#xff1a;芯片制造与封测技术社区&#xff0c;星球号&#xff1a;63559049&#xff09;里的学员问&#xff1a;我是晶圆厂厂务工程师&#xff0c;最近在面试新工作&#xff0c;但是几乎每家HR都会问我同一个问题&#xff1a;你结婚没有&#xff1…...

大数据开发面试题【Spark篇】

115、Spark的任务执行流程 driver和executor&#xff0c;结构式一主多从模式&#xff0c; driver&#xff1a;spark的驱动节点&#xff0c;用于执行spark任务中的main方法&#xff0c;负责实际代码的执行工作&#xff1b;主要负责&#xff1a;将代码逻辑转换为任务、在executo…...

深入分析 Android Activity (六)

文章目录 深入分析 Android Activity (六)1. Activity 的权限管理1.1 在 Manifest 文件中声明权限1.2 运行时请求权限1.3 处理权限请求结果1.4 处理权限的最佳实践 2. Activity 的数据传递2.1 使用 Intent 传递数据2.2 使用 Bundle 传递复杂数据 3. Activity 的动画和过渡效果3…...

火箭升空AR虚拟三维仿真演示满足客户的多样化场景需求

在航空工业的协同研发领域&#xff0c;航空AR工业装配系统公司凭借前沿的AR增强现实技术&#xff0c;正引领一场革新。通过将虚拟信息无缝融入实际环境中&#xff0c;我们为工程师、设计师和技术专家提供了前所未有的共享和审查三维模型的能力&#xff0c;极大地提升了研发效率…...

LeetCode 279 —— 完全平方数

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 此图利用动态规划进行求解&#xff0c;首先&#xff0c;我们求出小于 n n n 的所有完全平方数&#xff0c;存放在数组 squareNums 中。 定义 dp[n] 为和为 n n n 的完全平方数的最小数量&#xff0c;那么有状态…...

PHP发票真假API、医疗电子票据查验、发票识别接口开发示例

“营”“增”两种税是主流的流转税种&#xff0c;是两个独立而不能交叉的税种。也就是说交增值税的话就不交营业税&#xff0c;而交了营业税就不需要交增值税。而且&#xff0c;两者在征收的对象、征税范围、计税的依据、税目、税率以及征收管理等都有所不同&#xff0c;增值税…...

Python库之`lxml`的高级用法深度解析

Python库之lxml的高级用法深度解析 简介 lxml是一个功能强大的第三方库&#xff0c;它提供了对XML和HTML文档的高效处理能力。除了基本的解析和创建功能外&#xff0c;lxml还包含了一些高级用法&#xff0c;这些用法可以帮助开发者在处理复杂文档时更加得心应手。 高级解析技…...

参数的本质:详解 JavaScript 函数的参数

文章导读&#xff1a;AI 辅助学习前端&#xff0c;包含入门、进阶、高级部分前端系列内容&#xff0c;当前是 JavaScript 的部分&#xff0c;瑶琴会持续更新&#xff0c;适合零基础的朋友&#xff0c;已有前端工作经验的可以不看&#xff0c;也可以当作基础知识回顾。 上篇文章…...

悲痛都会过去,唯有当下值得珍惜

在生活的长河中&#xff0c;我们都会经历各种各样的悲痛与挫折&#xff0c;无论是来自原生家庭的困扰&#xff0c;婚姻中的曲折&#xff0c;还是小时候的创伤、男女关系中的纠葛、校园时期的霸凌。然而&#xff0c;当我们回首过去&#xff0c;曾经以为无法逾越的痛苦&#xff0…...

第三方软件测试机构进行代码审计需要哪些专业的知识?

代码审计 进行代码审计需要专业的知识&#xff0c;包括编程语言、操作系统、数据库、网络知识以及安全知识等。 1.编程语言知识是进行代码审计的基础&#xff0c;因为你需要理解代码的语法和结构。对于不同的应用程序&#xff0c;你需要了解其所使用的编程语言的特点和语法规…...

Modal.method() 不显示头部的问题

ant-design中的Modal组件有两种用法&#xff1a; 第一种是用标签&#xff1a;<a-modal></a-modal> 第二种是用Api&#xff1a;Modal.info、Modal.warning、Modal.confirm...... 一开始项目中这两种用法是混用的&#xff0c;后面UI改造&#xff0c;需要统一样式&…...

Java中的内部类及其用途

一、技术难点 在Java中&#xff0c;内部类是一个定义在另一个类内部的类。这种嵌套的结构带来了一些技术上的难点和挑战&#xff1a; 访问控制&#xff1a;内部类可以直接访问外部类的所有成员&#xff08;包括私有成员&#xff09;&#xff0c;但外部类不能直接访问内部类的…...

堆(建堆算法,堆排序)

目录 一.什么是堆&#xff1f; 1.堆 2.堆的储存 二.堆结构的创建 1.头文件的声明&#xff1a; 2.向上调整 3.向下调整 4.源码&#xff1a; 三.建堆算法 1.向上建堆法 2.向下建堆法 四.堆排序 五.在文件中Top出最小的K个数 一.什么是堆&#xff1f; 1.堆 堆就…...

多重插补与MICE:量化ESG评分不确定性的工程实践

1. 项目概述&#xff1a;当ESG评分遇上数据“黑洞”&#xff0c;我们如何量化不确定性&#xff1f;在金融和可持续投资领域&#xff0c;ESG评分正成为评估公司长期价值与风险的关键标尺。然而&#xff0c;从业者们都心知肚明一个公开的秘密&#xff1a;支撑这些评分的底层数据&…...

揭秘Gemini ESG引擎底层逻辑:3大AI模型协同如何将人工撰写耗时压缩90%?

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;Gemini ESG报告生成的演进与价值定位 传统ESG&#xff08;环境、社会与治理&#xff09;报告编制长期依赖人工数据收集、跨部门协调与静态模板套用&#xff0c;平均耗时长达3–6个月&#xff0c;且易出现口径…...

终极AI换脸指南:用roop-unleashed轻松制作专业级深度伪造视频

终极AI换脸指南&#xff1a;用roop-unleashed轻松制作专业级深度伪造视频 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要制作电影级别的AI换脸视频&am…...

你的B站缓存视频为何变成“僵尸文件“?3步解锁离线观看自由

你的B站缓存视频为何变成"僵尸文件"&#xff1f;3步解锁离线观看自由 【免费下载链接】m4s-converter 一个跨平台小工具&#xff0c;将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经兴奋地…...

终极GTA5线上小助手:免费开源的游戏体验增强工具完整指南

终极GTA5线上小助手&#xff1a;免费开源的游戏体验增强工具完整指南 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 你是否厌倦了在GTA5线上模式中重复枯燥的刷钱任务&#xff1f;是否对复杂的游戏机制…...

ChatGPT提示工程进阶实战(故事化表达失效的7大隐形陷阱)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;故事化表达失效的底层认知重构 当工程师在技术文档中反复使用“用户点击按钮后&#xff0c;系统就像一位耐心的向导&#xff0c;带他走过三步旅程”这类修辞时&#xff0c;信息熵并未降低——反而因隐喻失准而…...

3分钟解决Windows热键冲突:Hotkey Detective终极免费方案

3分钟解决Windows热键冲突&#xff1a;Hotkey Detective终极免费方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否…...

[智能体-28]:Python HTTP 请求库:requests 背景、原理、作用 完整版详解

一、全称与字面含义Requests&#xff1a;英文本意「请求、申请」Python 中&#xff1a;HTTP 请求库二、诞生背景Python 原生自带 urllib、urllib2语法冗长、写法繁琐、兼容性差、使用门槛高。2011 年 Kenneth Reitz 开发 requests口号&#xff1a;HTTP for Humans&#xff08;给…...

多任务学习优化文档级机器翻译:源语句重建与上下文重建策略对比

1. 项目概述&#xff1a;当翻译需要“瞻前顾后”在机器翻译领域&#xff0c;我们早已告别了那个逐字逐句、生硬拼接的时代。基于Transformer架构的神经机器翻译&#xff08;NMT&#xff09;模型&#xff0c;凭借其强大的序列建模能力&#xff0c;已经能够产出相当流畅、准确的句…...

基于注意力机制LSTM的孟加拉语新闻生成式摘要模型构建与实践

1. 项目概述&#xff1a;为什么孟加拉语新闻摘要值得投入&#xff1f;每天&#xff0c;我们都被海量的信息所淹没。对于孟加拉语使用者而言&#xff0c;从新闻网站获取信息时&#xff0c;常常需要花费大量时间阅读长篇文章&#xff0c;才能提取出核心事件。传统的抽取式摘要方法…...