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

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

主博客:

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

上一篇:

【MySQL精通之路】SQL优化(1)-查询优化(8)-嵌套联接优化-CSDN博客

下一篇:

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


外部联接包括LEFT JOINRIGHT JOIN

MySQL实现了一个A LEFT JOIN B 连接规范如下所示:

表B被设置为依赖于表A以及A所依赖的所有表。

表A被设置为依赖于LEFT JOIN条件中使用的所有表(B除外)。

LEFT JOIN条件用于决定如何从表B中检索行。(换句话说,不依赖WHERE子句中的任何条件。)

执行所有标准联接优化,但表总是在它所依赖的所有表之后读取。如果存在循环依赖关系,则会发生错误。

执行所有标准WHERE优化

如果a中有一行与WHERE子句匹配,但B中没有一行与ON条件匹配,则会生成一个额外的B行,所有列都设置为NULL。

如果您使用LEFT JOIN查找某些表中不存在的行,并且您有以下测试:WHERE部分中的col_name为NULL,其中col_name是声明为not NULL的列,MySQL在找到一行符合LEFT JOIN条件后,将停止搜索更多行(针对特定的键组合)。

RIGHT JOIN实现类似于LEFT JOIN,表角色颠倒。

如“外部联接优化”所述,右联接转换为等效的左联接。

对于LEFT JOIN,如果生成的NULL行的WHERE条件始终为false,则LEFT JON将更改为内部联接。例如,如果t2.column1为NULL,则以下查询中的WHERE子句将为false:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

 因此,将查询转换为内部联接是安全的:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

在MySQL 8.0.14及更高版本中,常量文字表达式产生的不重要的WHERE条件在准备过程中被删除,而不是在优化的后期阶段。

提前去除掉不必要查询条件允许优化器将外部联接转换为内部联接;这可以改进具有外部联接的查询的计划,这些联接包含WHERE子句中的琐碎条件,例如:

SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1

优化器现在在准备过程中看到0=1总是错误的,这使得OR 0=1是多余的,并将其删除,留下以下内容:

SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2

现在优化器可以将查询重写为内部联接,如下所示:

SELECT * FROM t1 JOIN t2 WHERE condition_1 AND condition_2

如上,联接已被简化现在,如果这样做会产生更好的查询计划,优化器可以在表t1之前使用表t2。

要提供有关表联接顺序的提示,请使用优化器提示;

参见“优化器提示”。

或者,使用STRIGHT_JOIN;参见“SELECT语句”。

但是,STRIGHT_JOIN可能会阻止使用索引,因为它会禁用半联接转换;

请参阅“使用半联接转换优化IN和EXISTS子查询语句”。

 
 


 主博客:

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

上一篇:

【MySQL精通之路】SQL优化(1)-查询优化(8)-嵌套联接优化-CSDN博客

下一篇:

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

相关文章:

  • 深入Java:JSON解析与操作的艺术
  • Ubuntu安装IPOPT和Casadi
  • 打印机里失败的任务删不掉的解决办法 斑马打印机更新电脑驱动和升级打印机固件 提示ribbon out 并黄状态亮+黄供应闪
  • python列表底层原理
  • 视图【mysql数据库】
  • 百度智能云千帆AppBuilder升级!开放多源模型接入,思考模型再次加速!
  • CentOS 7 安装 Minio
  • 【晚风摇叶之其他】抖音直播弹幕解析,连接websocket解析弹幕内容
  • 第三方软件检测机构要具备哪些资质要求?专业测试报告如何申请?
  • YOLO系列模型发展史
  • Linux防火墙配置案例分析:常见网络攻击的防御
  • 接下来的目标与内容
  • 利用cherry pick巧妙地将某次提交单独合并到其他分支
  • 【华为OD机试-C卷D卷-200分】反射计数(C++/Java/Python)
  • MySQL中如何知道数据库表中所有表的字段的排序规则是什么?
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【附node操作实例】redis简明入门系列—字符串类型
  • CODING 缺陷管理功能正式开始公测
  •  D - 粉碎叛乱F - 其他起义
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript设计模式之工厂模式
  • Js基础知识(一) - 变量
  • linux学习笔记
  • php的插入排序,通过双层for循环
  • 翻译--Thinking in React
  • 好的网址,关于.net 4.0 ,vs 2010
  • 和 || 运算
  • 聚类分析——Kmeans
  • 普通函数和构造函数的区别
  • 深度学习在携程攻略社区的应用
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用 Swift 编写面向协议的视图
  • 追踪解析 FutureTask 源码
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • ## 基础知识
  • #Z0458. 树的中心2
  • $GOPATH/go.mod exists but should not goland
  • (07)Hive——窗口函数详解
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (4)Elastix图像配准:3D图像
  • (LeetCode C++)盛最多水的容器
  • (Matlab)使用竞争神经网络实现数据聚类
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计ssm电影分享网站
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十七)、Mac 安装k8s
  • (五)Python 垃圾回收机制
  • (一) 初入MySQL 【认识和部署】
  • (一)基于IDEA的JAVA基础12