MySQL 8.0 官方文档 第八章 优化(二十五)—— 使用物化优化子查询

第八章 优化(二十五)—— 使用物化优化子查询

8.2 优化SQL语句

8.2.2 优化子查询、派生表、视图引用和公共表表达式

8.2.2.2 使用物化优化子查询

优化器使用物化以实现对子查询更高效的处理。物化是通过将子查询结果生成为一个临时表(通常在内存中)来加速查询执行。MySQL第一次需要子查询结果时,会将结果物化为一个临时表。任何后续需要该结果的时候,MySQL都会再次引用该临时表。优化器会使用散列索引对该表进行索引,从而使查找快速且低成本。该索引仅包含唯一的值以消除重复并使表体积变小。

在可能的情况下,子查询物化会使用内存中的临时表,但是,如果该临时表变得太大,则只能求助于磁盘存储。参见 8.4.4节 “MySQL内部临时表的使用”。

如果不使用物化,优化器有时会将不关联子查询重写为关联子查询。例如,下面的IN子查询是不关联的(where_condition条件中只涉及表t2的列,而不涉及到t1):

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

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

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

使用了临时表的查询物化避免了这样的重写,并且使该子查询只执行一次成为可能,而不是在遍历外部查询中的每一行时都执行一次。

为了在MySQL中能使用子查询物化,必须启用optimizer_switch系统变量materialization标志(参见8.9.2节,“可切换优化”)。启用了物化标志后,物化适用于出现在任何位置的(例如:在选择列表,WHERE, ON, GROUP BY, HAVING,或ORDER BY中)子查询谓词,这些谓词属于以下任何用例:

  • 当外部表达式oe_i或内部表达式ie_i都不为空(nullable)时,谓词具有以下形式,其中 N等于1或大于1。

    (oe_1, oe_2, ..., oe_N) [NOT] IN (SELECT ie_1, ie_2, ..., ie_N ...)
    
  • 当只有一个外部表达oe和内部表达式ie时,谓语就有以下形式。其中的表达式可以为空。

    oe [NOT] IN (SELECT ie ...)
    
  • 如果谓词是INNOT IN, 则计算结果是UNKNOWN (NULL)与结果是FALSE具有相同的含义。

下面的例子演示了,对UNKNOWN(不知道)和FALSE谓词计算结果是否相等的要求不同,是如何影响是否可以使用子查询物化。假设where_condition只涉及t2的列,而没有涉及t1的列,因此子查询是不关联的。

以下查询使用了物化:

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

在这里,IN谓词返回UNKNOWN还是FALSE并不重要。无论哪种方式,表t1中的行都不会包含在查询结果中。

而下面的查询没有使用子查询物化,因为其中列t2.b是可以为null的:

SELECT * FROM t1
	WHERE (t1.a, t1.b) NOT IN 
		(SELECT t2.a, t2.b FROM t2
        	WHERE where_condition);

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

  • 内外表达式的类型必须匹配。例如,如果两种表达式都是integerdecimal,则优化器可能会使用物化,但是如果一个表达式是integer,另一个是decimal,则优化器不能使用物化。

  • 内部表达式不能是BLOB

使用了EXPLAIN的查询会提供了一些优化器是否使用了子查询物化的提示。

  • 与没有使用物化的查询相比,EXPLAIN输出中select_type(选择类型)列提示的内容会从DEPENDENT SUBQUERY(关联子查询)改变为SUBQUERY(子查询)。这表明了对于每个外部行都会执行一次子查询,而物化使子查询只执行一次。

  • 对于扩展的EXPLAIN输出,接着执行SHOW WARNINGS显示的文本会包含materialize(物化)和materialized-subquery(物化的子查询)。

在MySQL 8.0.21及更高版本中,MySQL也可以将子查询物化应用到单表UPDATEDELETE语句中,使用的前提是要求使用[NOT] IN[NOT] EXISTS子查询谓词,但是没有使用ORDER BYLIMIT,并且可以通过优化器提示或优化器可切换设置来允许使用子查询物化。


上一集 MySQL 8.0 官方文档 第八章 优化(二十四)—— 用半连接转换优化IN和EXISTS子查询谓词

下一集 MySQL 8.0 官方文档 第八章 优化(二十六)—— 使用EXISTS策略优化子查询

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL官方文档MySQL数据库管理系统的官方参考指南,提供了全面而详细的文档资源,旨在帮助用户了解和使用MySQL数据库。MySQL 8.0官方文档中也提供了中文版,方便中国用户阅读和查找所需的信息。 MySQL 8.0官方文档中文版内容包括了MySQL数据库的各个方面,涵盖了安装、配置、使用、维护和开发等各个方面的知识。文档以清晰的结构组织,使用简单明了的语言描述概念和操作步骤,易于理解和学习。 该中文版文档包括了以下主要内容: 1. 概述:介绍MySQL数据库和其特点,以及MySQL 8.0的新功能和改进。 2. 安装和配置:讲解了如何下载、安装和配置MySQL数据库的步骤和指南。 3. 使用MySQL:包括了数据库的基本操作,如创建和管理表、插入和查询数据、更新和删除数据等。 4. 数据库管理:介绍了如何管理MySQL数据库,包括用户和权限管理、备份和还原数据库、性能优化等。 5. 高级主题:涵盖了高级技术主题,如存储过程、触发器、视图、复制和集群等。 6. 开发者指南:提供了MySQL数据库的开发者指南,包括了MySQL语法、数据类型和连接器等。 通过阅读MySQL 8.0官方文档中文版,用户可以轻松学习和掌握MySQL数据库,从基础操作到高级技术都可以找到相应的信息。并且,文档还提供了示例代码和实用的技巧,帮助用户更好地使用优化MySQL数据库。 总的来说,MySQL 8.0官方文档中文版是MySQL数据库的权威参考,对于想要学习和使用MySQL的用户来说,是不可或缺的宝贵资源。 ### 回答2: MySQL官方文档MySQL数据库管理系统的官方技术文档,提供了全面的关于MySQL 8.0版本的信息和指导。 MySQL 8.0官方文档中文版主要包括以下内容: 1. 介绍和安装:文档提供了MySQL 8.0的简介,包括其特性和优势。同时也提供了安装MySQL数据库的详细步骤和注意事项。 2. 数据类型和操作:文档详细介绍了MySQL 8.0支持的各种数据类型,以及这些数据类型的操作和限制。无论是整型、浮点型、日期时间型还是字符串类型,都有详细的解释和示例。 3. 查询语言和操作:文档详细介绍了MySQL 8.0的查询语言(SQL)的语法和用法,包括各种查询语句的编写和执行。同时也介绍了常用的数据操作语句,如插入、更新、删除等。 4. 数据库管理和安全:文档提供了关于MySQL 8.0数据库管理的指南,包括创建和管理数据库、用户和权限的操作。此外,还介绍了如何保护数据库的安全,如使用SSL加密、访问控制等。 5. 性能优化和高可用性:文档提供了关于MySQL 8.0性能优化和高可用性的指导,包括查询优化、索引设计、存储引擎选择等方面的内容。同时也介绍了MySQL复制和集群等高可用性解决方案。 6. 开发接口和工具:文档提供了关于MySQL 8.0的开发接口和工具的介绍和用法,如MySQL Connector、MySQL Workbench等。此外,也提供了一些常用的开发示例和最佳实践。 总之,MySQL 8.0官方文档中文版是MySQL数据库管理系统的权威指南,提供了全面的相关信息和指导。无论是初学者还是有经验的开发者,都可以通过阅读该文档来了解和使用MySQL 8.0。 ### 回答3: MySQL 8.0官方文档已经提供了中文版。它是MySQL数据库的权威参考文档,提供了完整的MySQL 8.0版本的文档信息。中文版官方文档的发布使得中文用户能够更方便地了解和使用MySQL 8.0MySQL 8.0官方文档中文版涵盖了广泛的主题,包括基本概念、安装和升级、配置和管理、备份和恢复、性能优化等。该文档提供了详细的指南和示例,使用户能够更好地理解和使用MySQL 8.0的各种功能和工具。 MySQL 8.0官方文档中的中文翻译准确而清晰,使用简洁明了的语言,使读者能够轻松掌握MySQL 8.0的各个方面。无论是初学者还是有经验的用户,都能够通过这份文档更好地理解和使用MySQL 8.0,从而更高效地管理和操作数据库。 通过阅读MySQL 8.0官方文档的中文版,用户可以学习如何安装和配置MySQL服务器,了解数据库的基本操作和管理,掌握SQL查询语言的基本语法和高级技巧,学习如何进行性能优化和故障排除等。 总而言之,MySQL 8.0官方文档中文版是一份非常有价值的资源,能够帮助中文用户更好地学习和使用MySQL 8.0,实现更高效的数据库管理和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值