MySQL 8.0 官方文档 第八章 优化(八)—— 嵌套循环连接算法

第八章 优化(八)—— 嵌套循环连接算法

8.2 优化SQL语句

8.2.1 优化 SELECT 语句

8.2.1.7 嵌套循环连接算法

MySQL使用嵌套循环算法或其变体在表与表之间执行连接,一共有两种方式,即:

  • 嵌套循环连接算法

  • 块嵌套循环连接算法

嵌套循环连接算法

简单嵌套循环连接(nested-loop join --> NLJ)算法每次从外循环的第一个表中读取一行,然后,把读取的每一行传递给嵌套的内部循环,该循环处理连接中的下一个表(译者:即传递进来的那行数据与内部表的每行数据进行连接)。只要还有表需要连接,这个过程就会进行下去。

假设有三个表t1t2t3,它们之间进行的连接将使用以下连接类型:

Table   Join Type
t1      range
t2      ref
t3      ALL

如果使用简单嵌套循环连接算法,则按如下方式进行连接:

for each row in t1 matching range {                            # 循环t1表匹配范围的每一行
	for each row in t2 matching reference key {                # 循环t2表匹配引用键的每一行
		for each row in t3 {                                   # 循环t3表的每一行
			if row satisfies join conditions, send to client   # 如果该行符合连接条件,发送到客户端
		}
	}
}

因为嵌套循环连接算法每次从外部循环传递一行到内部循环,与内部循环中的表中符合条件的行进行比较连接,所以它通常会多次读取内部循环中表中的数据进行处理。

块嵌套循环连接算法

块嵌套循环(Block Nested-Loop --> BNL)连接算法采用在外部循环中一次读取一定量的行保存到缓冲区,然后把缓冲的数据全部传递给内部循环,在内部进行处理,从而减少了必须读取内部循环中的表的次数。例如,如果将10行数据读入到缓冲区并将该缓冲区传递给下一个内部循环,则可以将内部循环中读取的每一行与缓冲区中的所有10行进行处理。这将使必须读取内部表的次数减少一个数量级。

在MySQL 8.0.18之前,该算法适用于没有索引的等值连接;在MySQL 8.0.18及更高版本中,在这种情况下,会使用哈希连接优化。从MySQL8.0.20开始,MySQL不再使用块嵌套循环,在以前使用块嵌套循环的所有情况下都使用哈希连接。请参阅第8.2.1.4节“哈希连接优化”。

MySQL连接缓冲具有以下特点:

  • 当连接类型为全表(ALL)或索引(index)(换句话说,当不能使用可能的键(possible keys),并且分别对数据行或索引行进行完全扫描)或范围(range)时,可以使用连接缓冲。缓存的使用也适用于外部连接,如8.2.1.12节“块嵌套循环和批量键访问连接”所述。

  • 即使连接的类型是ALLindex,连接缓冲也永远不会分配给第一个非常量表。

  • 只有连接感兴趣的列才存储在其连接缓冲区中,而不是整行。

  • join_buffer_size(连接缓冲大小)系统变量决定用于处理查询的每个连接缓冲区的大小。

  • 为每个可以缓冲的连接都分配一个缓冲区,因此可以使用多个连接缓冲区处理给定的查询。

  • 连接缓冲区在执行连接之前分配,在查询完成后释放。

相对于前面的嵌套循环连接算法描述的连接示例(无缓冲),现在使用连接缓冲算法,按如下方式进行连接:

for each row in t1 matching range {                               # 循环t1表匹配范围的每一行
	for each row in t2 matching reference key {                   # 循环t2表匹配引用键的每一行
		store used columns from t1, t2 in join buffer             # 在连接缓冲区中保存t1和t2表中用到的列
		if buffer is full {                                       # 如果缓冲区已满
			for each row in t3 {                                  # 循环t3表的每一行
				for each t1, t2 combination in join buffer {      # 循环缓冲区中每个t1和t2表中列的结合体
				if row satisfies join conditions, send to client  # 如果结合体符合条件,发送到客户端
			}
		}
		empty join buffer                                         # 清空连接缓冲区
		}
	}
}

if buffer is not empty {                    # 如果缓冲区非空(应该是最后一次数据量不大,缓冲区不能满的情形)
	for each row in t3 {
		for each t1, t2 combination in join buffer {
			if row satisfies join conditions, send to client
		}
	}
}

如果S是连接缓冲区中存储的每个t1,t2表中列组合的大小,C为连接缓冲区中存储的组合数,则扫描表 t3的次数为:

(S * C) / join_buffer_size + 1

t3表扫描的次数会随着 join_buffer_size(连接缓冲区大小)值的增加而减少,直到 join_buffer_size足够大,足以容纳所有之前的行组合。达到这一点后,使它再变大也不能提高速度了。

上一集 MySQL 8.0 官方文档 第八章 优化(七)—— 索引条件下推优化

下一集 MySQL 8.0 官方文档 第八章 优化(九)—— 嵌套连接优化

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答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,实现更高效的数据库管理和开发。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值