MySQL基于规则优化[亲测有效]

MySQL基于规则优化[亲测有效]查询重写: 条件化简:移除不必要括号、常熟传递、等值传递、移除无用条件、表达式计算、HAVING子句和WHERE子句合并、常量表检测 外连接消除:空值拒绝(外连接中通过where子句过滤NULL值)…

MySQL基于规则优化

  1. 条件化简:移除不必要括号、常熟传递、等值传递、移除无用条件、表达式计算、HAVING子句和WHERE子句合并、常量表检测
  2. 外连接消除:空值拒绝(外连接中通过where子句过滤NULL值),符合条件后,内外连接可以互相转换,优化器可以评估表的不同连接顺序降低查询成本
  3. 子查询优化: 按返回的结果集不同子查询分为标量子查询(查询单一值)、行子查询、列子查询和表子查询 按与外层查询关系分为不相关子查询(子查询不依赖外层查询结果)和相关子查询 子查询在布尔表达式的使用:
  4. 对于<、>、=之类操作符来说,子查询只能是标量子查询或行子查询
  5. 对于[NOT] IN(判断某个操作数是否在某个子查询结果集中)/ANY/SOME (只要子查询结果集中存在某个值和给定操作数比较为true,则表达式为true)/ALL(操作数必须与结果集全部匹配)来说,子查询是一个集合
  6. EXIST,仅需要判断子查询是否有记录。

注:

  1. 子查询必须用小括号扩起来。
  2. 在SELECT子句中的子查询必须是标量子查询。
  3. 在想要得到标量子查询或者行子查询,但又不能保证子查询的结果集只有一条记录时,应该使用LIMIT 1语句来限制记录数量。
  4. 对于[NOT] IN/ANY/SOME/ALL子查询来说,子查询中不允许有LIMIT语句。
  5. ORDER BY子句、DISTINCT语句以及没有聚集函数以及HAVING子句的GROUP BY子句在子查询中无意义,查询优化器会直接删除。
  6. 不允许在一条语句中增删改某个表的记录时同时还对该表进行子查询。

物化表:不直接将不相关子查询的结果集作为外层查询的参数,而是将结果集写入一个临时表中,写入记录会被去重,表的列就是结果集的列。

物化表查询相当于子查询与外层查询的内连接。

半连接:对于s1中的某条记录,只关心在s2中是否有记录与之匹配,而不关心具体有多少条记录与之匹配,只保留s1表的记录。

半连接实现策略,查询优化器会选择以下成本最低的策略:

  1. Table pullout (子查询中的表上拉):子查询查询条件只有主键或唯一索引时,转连接查询。
  2. DuplicateWeedout execution strategy (重复值消除):加入结果集前,尝试加入到只包含主键的临时表,根据能否插入判断是否重复。
  3. LooseScan execution strategy (松散扫描):对于多条相同值索引,只取第一条查询记录,匹配成功后,把同索引均加入结果集。
  4. Semi-join Materialization execution strategy(半连接物化策略):不想管子查询物化后连接查询
  5. FirstMatch execution strategy (首次匹配):取一条外层查询的中的记录,然后到子查询的表中寻找符合匹配条件的记录,如果能找到一条,则将该外层查询的记录放入最终的结果集并且停止查找更多匹配的记录,如果找不到则把该外层查询的记录丢弃掉,重复上述过程

semi-join的适用条件:

  1. 子查询必须是和IN语句组成的布尔表达式,并且在外层查询的WHERE或者ON子句中出现。
  2. 外层查询也可以有其他的搜索条件,只不过和IN子查询的搜索条件必须使用AND连接起来。
  3. 该子查询必须是一个单一的查询,不能是由若干查询由UNION连接起来的形式。
  4. 该子查询不能包含GROUP BY或者HAVING语句或者聚集函数。

对于不能转换semi-join的子查询:

  1. 对于不相关子查询,可以将其物化后再参与查询。
  2. 不管是相关子查询还是不相关子查询,都可以将IN子查询转换为EXISTS子查询。

MySQL不相关子查询的优化方式多为子查询转连接

子查询结果相当于一个派生表,对于派生表的处理,优先尝试把派生表和外层查询合并掉,如果不行的话,再把派生表物化掉执行查询。

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

(0)
上一篇 2023-02-28
下一篇 2023-02-28

相关推荐

  • 翻译|使用 StatefulSet 运行数据库应用

    翻译|使用 StatefulSet 运行数据库应用本文介绍 Kubernetes 支持数据库等有状态应用的常见解决方案:StatefulSet。 在构建机器学习向量管理层时,我们面临的一个重要问题:如何持久化数据以避免数据丢失? 在阅读了许多数据库企

    2023-06-01
    150
  • Sqlserver 报错“参数数据类型 ntext/text 对于 replace 函数的参数 1 无效”的解决方案及原理分析扩展

    Sqlserver 报错“参数数据类型 ntext/text 对于 replace 函数的参数 1 无效”的解决方案及原理分析扩展原因:在数据查询中replace函数无法对表table中text/ntext类型的字段colname进行了字符串操作。 解决方法:将text当作varchar(实际内容长度低于8000字节时)或把nt

    2023-02-14
    150
  • 利用Python Numpy进行高效排序

    利用Python Numpy进行高效排序排序是计算机科学中常见的问题之一,也是数据分析、机器学习等领域中必不可少的处理过程。Python中的Numpy库为我们提供了高效的排序算法,本文将介绍如何使用Python Numpy进行高效排序。

    2024-04-07
    76
  • Babelfish for PostgreSQL[亲测有效]

    Babelfish for PostgreSQL[亲测有效]Babelfish for PostgreSQL开源已快一月,不过全网还没有实践者总结。今天我们就测试看看,Babelfish到底是如何部署与使用的!

    2023-06-15
    160
  • MySQL实战45讲 14「终于解决」

    MySQL实战45讲 14「终于解决」MySQL实战45讲 14 count(*) 的实现方式 执行 count(*) 操作时的优化 自己计数的方法 不同的 count 用法

    2023-05-28
    145
  • MySQL是怎么解决幻读问题的?[通俗易懂]

    MySQL是怎么解决幻读问题的?[通俗易懂]前言 我们知道MySQL在可重复读隔离级别下别的事物提交的内容,是看不到的。而可提交隔离级别下是可以看到别的事务提交的。而如果我们的业务场景是在事物内同样的两个查询我们需要看到的数据都是一致的,不能被

    2023-04-19
    157
  • Python元组:不可变序列容器

    Python元组:不可变序列容器Python是一种高级编程语言,它具有简单易学、可读性强、高效等优点。在Python中,数据类型包括数字、字符串、列表、元组、集合和字典等。本文将对元组(tuple)这种数据类型进行详细的讲解。

    h3一、元组的定义和基本操作/h3

    p元组是Python中的一种不可变序列容器,用逗号隔开若干个数据项(可以是任意数据类型),并使用小括号进行包裹即可。元组中的数据可以通过下标进行访问,也可以通过切片进行操作。元组一旦创建后,就不能再进行修改,因此可以实现常量级别的数据存储和传递。示例代码如下:

    2024-02-05
    98
  • Python DBF库简介

    Python DBF库简介随着大数据时代的到来,数据处理变得越来越重要。DBF文件格式是一种常见的存储表格数据的文件格式,很多系统或软件使用该文件格式进行数据存储与传输。Python DBF库是一款用于读写DBF文件的工具库,为Python程序员提供了一种方便的文件处理方式。本文将结合代码示例,深入介绍Python DBF库的基本概念、使用方法和在实际开发中的应用场景。

    2024-08-11
    29

发表回复

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