mysql对子查询的优化改写

mysql对子查询的优化改写《高性能mysql第三版》提到mysql会将in子查询改写成exists查询(书中基于的mysql版本是5.1.50和5.5) 但是在5.6之后,已经优化成使用半连接查询 首先要提的当然是臭名昭著的…

《高性能mysql第三版》提到mysql会将in子查询改写成exists查询(书中基于的mysql版本是5.1.50和5.5)

但是在5.6之后,已经优化成使用半连接查询

首先要提的当然是臭名昭著的MySQL子查询问题,在MySQL5.5及之前的版本,所有有经验的MySQL DBA都会告诉你:绝不能在SQL的WHERE子句中使用子查询,因为那将可能产生灾难性的后果,因为很有可能每扫描一条数据,Where子查询都会被重新执行一遍,workaround的办法就是把WHERE里的子查询提升到FROM中,做成join操作;

和普通join查询不同的是,在semi join中,inner table 的结果集没有重复数据,当两表关联时,例如t1 semi join t2, 当t2存在匹配的记录时,返回t1的记录(t2的记录不会加入操作的结果集中),并且t1的记录最多只返回一次;不像inner join,每一个匹配的记录都会返回,对于semi join,在乎的只是是否匹配子查询而已。

 

 

 

SELECT class_num, class_name FROM class WHERE class_num IN (SELECT class_num FROM roster);

在这里,优化器可以识别出该 IN子句要求子查询仅返回roster表中每个类编号的一个实例 。在这种情况下,查询可以使用半联接;也就是说,该操作仅返回的每一行的一个实例,该实例 class与的行匹配 roster

外部查询规范中允许使用外部联接和内部联接语法,并且表引用可以是基表,派生表或视图引用。

 

 

 

结论:

1、mysql5.5以前会将 in 子查询改写成 exists 查询,如果外部表数据量大的情况下性能会非常糟糕。

2、mysql5.7(5.6没有测过,感兴趣的同学可以测测)对 in 子查询进行了优化,会将sql改写成 join 连接,这样优化器就可以始终优先访问数据量小的表格,减少IO,性能和直接写连接查询几乎是一样的(这点和网上书上说的是有出入的)。

3、exists查询会被分解成一个外部查询和相关子查询(DEPENDENT SUBQUERY),这样子查询会依赖于外部查询的结果,所以始终会对外部表进行全表扫描,外部表数据量大的时候要尤其注意。

 

 

参考文章

http://www.ishenping.com/ArtInfo/3900373.html        mysql数据库中 IN 和 EXISTS 的误区

https://dev.mysql.com/doc/refman/5.5/en/subquery-optimization.html        mysql官方文档解释

https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html        mysql官方文档解释

https://yq.aliyun.com/articles/41095     MySQL 5.6的优化器改进

 

注意:

1:可以通过show warnings查看

2:阅读参考文章

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10550.html

(0)
上一篇 2022-12-25
下一篇 2022-12-25

相关推荐

  • 用SQL语句获取常见的几种日期「终于解决」

    用SQL语句获取常见的几种日期「终于解决」用SQL语句获取常见的几种日期数值 上周 SELECT TO_CHAR(TRUNC(SYSDATE, 'IW') – 7, 'yyyymmdd') FROM DUAL

    2023-03-11
    111
  • 深入剖析Python中Sunken意义

    深入剖析Python中Sunken意义Sunken是tkinter库中的一个属性,用于设置控件的风格外观。通常在按钮、菜单栏等可点击的控件上使用Sunken效果,以突出控件的交互性。它的主要特点是在控件的边框线内凹陷一个像素,形成一种3D的立体效果。

    2024-04-04
    23
  • 故障分析 | MySQL 优化案例 – 字符集转换「建议收藏」

    故障分析 | MySQL 优化案例 – 字符集转换「建议收藏」作者:xuty 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文关键字:SQL 优化、字符集 一、背景 Server version: 5.7…

    2023-03-17
    117
  • Python爬取网页数据的基本方法

    Python爬取网页数据的基本方法近年来,随着互联网的飞速发展,数据已经成为了我们日常生活中不可或缺的一部分。如何从海量数据中获取我们想要的部分?Python爬虫技术可以解决这一问题。Python可以通过爬虫技术从网页中抓取数据,因此Python也被称为是数据科学的利器之一。本文将从多个方面分享Python爬取网页数据的基本方法。

    2024-04-28
    36
  • mysql 读写分离_mariadb修改数据库存储路径

    mysql 读写分离_mariadb修改数据库存储路径DB读写分离描述 数据库的读写分离其实就是为了加减少数据库的压力;数据库的写入操作由主数据库来进行,读取操作由从数据库来进行操作。 实现数据库读写分离技术是有很多方法的,在这里我就用一个比较简单的m…

    2023-02-23
    100
  • Python arange函数详解

    Python arange函数详解a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-05-06
    14
  • JavaScript中向数组指定位置添加元素

    JavaScript中向数组指定位置添加元素对于开发者来说,在JavaScript中向数组指定位置添加元素是很常见的操作。实现这个功能,可以使用JavaScript内置的splice()方法完成。该方法可以接收3个参数:index(指定位置的下标)、howMany(需要删除的元素个数)和element1、element2、……、elementN(需要添加的元素)。因此,本文将详细阐述在JavaScript中实现向数组指定位置添加元素的方法,以及如何正确地使用splice()方法。

    2024-04-18
    26
  • 如何正确管理HBase的连接,从原理到实战「建议收藏」

    如何正确管理HBase的连接,从原理到实战「建议收藏」本文将介绍HBase的客户端连接实现,并说明如何正确管理HBase的连接。 最近在搭建一个HBase的可视化管理平台,搭建完成后发现不管什么查询都很慢,甚至于使用api去listTable都要好几秒…

    2023-02-19
    93

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注