当前位置: 首页 > 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.堆 堆就…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space

问题&#xff1a;IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案&#xff1a;将编译的堆内存增加一点 位置&#xff1a;设置setting-》构建菜单build-》编译器Complier...