MySQL5.7性能优化系列(二)——SQL语句优化(3)——使用物化策略优化子查询

优化器使用物化策略(Materialization)来实现更有效的子查询处理。通过生成子查询结果作为临时表,通常在内存中,实现加速查询执行。 MySQL首次需要子查询结果,将该结果实现为临时表。任何随后的结果都需要,MySQL再次指向临时表。优化器可以使用散列索引对表进行索引,以使查找更加快速和便宜。该索引是唯一的,它消除了重复,并使表格更小。

子查询实现可能时使用内存中临时表,如果表变得太大,则返回到磁盘存储。

如果不使用物化策略,则优化器有时将非相关子查询重写为相关子查询。例如,以下IN子查询是不相关的(where_condition仅涉及从t2而不是t1的列):

1.SELECT * FROM t1
2.WHERE t1.a IN (SELECT t2.b FROM t2 WHERE where_condition);

优化器可能会将其重写为EXISTS相关的子查询:

1.SELECT * FROM t1
2.WHERE EXISTS (SELECT t2.b FROM t2 WHERE where_condition AND t1.a=t2.b);

使用临时表的子查询实现避免了这种重写,并且使得可以仅执行一次而不是每行外部查询一次执行子查询。

对于要在MySQL中使用的物化的子查询,必须启用optimizer_switch系统变量materialization标志。启用实现标志后,实现应用于出现在任何地方的子查询谓词(在选择列表中,WHERE,ON,GROUP BY,HAVING或ORDER BY),适用于任何这些用例的谓词:

  • 谓词具有此形式,当外部表达式oe_i或内部表达式ie_i为空时。 N为1以上。
(oe_1, oe_2, ..., oe_N) [NOT] IN (SELECT ie_1, i_2, ..., ie_N ...)
  • 谓词具有这种形式,当存在单个外部表达式oe和inner expression ie时。表达式可以为空。
oe [NOT] IN (SELECT ie ...)
  • 谓词为IN或NOT IN,UNKNOWN(NULL)的结果与FALSE的含义相同。

以下示例说明了对UNKNOWN和FALSE谓词评估的等价性的要求如何影响是否可以使用子查询实现。假设where_condition仅包含从t2而不是t1的列,以便子查询不相关。

此查询可能会实现:

1.SELECT * FROM t1
2.WHERE t1.a IN (SELECT t2.b FROM t2 WHERE where_condition);

以下限制适用于使用子查询物化:

  • 内部和外部表达式的类型必须匹配。例如,如果两个表达式都是整数,或两者都是十进制,则优化器可能能够使用实现,但如果一个表达式是整数,而另一个是十进制,则不能使用实现。
  • 内部表达式不能是BLOB。

使用EXPLAIN查询可以提供优化器是否使用子查询物化的指示。与不使用实现的查询执行相比,select_type可能会从“依赖子查询”更改为“子查询”。这表明,对于将在每个外部行执行一次的子查询,实现使子查询只能执行一次。此外,对于扩展EXPLAIN输出,由以下SHOW WARNINGS显示的文本包括物化和物化子查询。

时间: 2024-11-06 09:29:47

MySQL5.7性能优化系列(二)——SQL语句优化(3)——使用物化策略优化子查询的相关文章

sql server 性能调优之 SQL语句阻塞查询

原文:sql server 性能调优之 SQL语句阻塞查询 在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后.就需要检查数据库是否有出现阻塞 当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁.再加上做了同步镜像,很消耗资源. 这时就要新建一个会话,大概需要了解以下几点: 1.当前活动会话量有多少? 2.会话运行时间? 3.会话之间有没有阻塞? 4.阻塞时间 ? 查询阻塞的方法有很多.有sql

SQL Server之 (二) SQL语句 模糊查询 空值处理 聚合函数

(二) SQL语句  模糊查询  空值处理  聚合函数 自己学习笔记,转载请注明出处,谢谢!---酸菜 SQL :结构化查询语言(Structured Query Language),关系数据库管理系统的标准语言. Sybase与Mircosoft对标准SQL做了扩展:T-SQL (Transact-SQL); 注:①SQL对大小写的敏感取决于排序规则,一般不敏感; ②SQL对单引号的转义,用两个单引号来表示一个单引号; ③SQL执行顺序: 1→2→3→4 select  * ---------

MySQL数据库优化技术之SQL语句慢查询定位

通过show status命令了解各种SQL的执行频率 MySQL客户端连接成功后,通过使用show [session|global] status 命令可以提供服务器状态信息: 其中的session来表示当前的连接的统计结果,global来表示自数据库启动至今的统计结果,默认是session级别的. show status 常用命令: show status like 'com_%'; 其中com_xxx表示xxx语句所执行的次数: 重点注意com_select, com_insert, co

Expert 诊断优化系列-------------针对重点语句调索引

上一篇我们说了索引的重要性,一个索引不仅能让一条语句起飞,也能大量减少系统对CPU.内存.磁盘的依赖.我想上一篇中的例子可以说明了.给出上一篇和目录文链接: SQL SERVER全面优化-------索引有多重要? SQL SERVER全面优化-------Expert for SQL Server 诊断系列 书接前文,我们知道了索引的重要,也知道了索引怎么加,那么我们应该往那些语句加?语句一条一条漫无目的的优化么?我怎么找出系统的问题语句?怎么样的一个优先级?  很多对数据库了解不是很多的人,

MySql数据库3【优化2】sql语句的优化

1.SELECT语句优化 1).利用LIMIT 1取得唯一行[控制结果集的行数] 有时,当你要查询一张表是,你知道自己只需要看一行.你可能会去的一条十分独特的记录,或者只是刚好检查了任何存在的记录数,他们都满足了你的WHERE子句.在这种情况下,增加一个LIMIT 1会令你的查询更加有效.这样数据库引擎发现只有1后将停止扫描,而不是去扫描整个表或索引. 2).不要使用BY RAND()命令 这是一个令很多新手程序员会掉进去的陷阱.你可能不知不觉中制造了一个可怕的平静.这个陷阱在你是用BY RAN

MySql语句性能问题定位--从sql语句到磁盘IO检查

写在前面:本文只针对IO导致MySql性能问题的定位,其他如CPU.MySql参数配置.程序自身等问题需要进一步补充. 背景:某条sql建表语句运行了15秒  :( Step1: 开启profiling SET profiling = 1; 关闭 SET profiling = off; 找到运行慢的sql语句ID show profiles; 查看sql语句CPU/IO等耗时具体的量化数据 show profile CPU,SWAPS,BLOCK IO,MEMORY,CONTEXT SWITC

怎么样去优化我们的SQL语句

1.改写in 在SQL语言中,一个查询块可以作为另一个查询块中谓词的一个操作数.因此,SQL查询可以层层嵌套.例如在一个大型分布式数据库系统中,有订单表Order.订单信息表OrderDetail,如果需要两表关联查询: SELECT CreateUser FROM Order  WHERE OrderNo IN   ( SELECT OrderNo  FROM OrderDetail  WHERE Price=0.5) 可替代方案: SELECT CreateUser FROM Order,O

mysql优化--explain分析sql语句执行效率

Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select - from - [where -] 例如:explain select * from news; 输出:+----+-------------+-------+-------+-------------------+---------+-

SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约500 MPixels/Sec的单次迭代速度。

  2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过那个时候看到是迭代的算法,而且迭代的次数还蛮多了,就觉得算法应该不会太快,所以就放弃了对其进一步优化.最近,又偶尔一次碰触到该文章和代码,感觉还是有蛮大的优化空间的,所以抽空简单的实现他的算法.   该算法作者已经完全开源,项目地址见:https://github.com/YuanhaoGong/C