MySQL 8.0发布,你熟悉又陌生的Hash Join?
昨天下午在查资料的时候,无意间点到了MySQL的官网。发现MySQL发布了一个新版本。
Mysql这个数据库有没有人不熟悉?不用的?没有吧。
2019年末,MySQL发布的8.0.18 GA版本,带来了一些新特性和增强功能。其中引人注目的莫过于多表连接查询支持Hash Join。
还是老样子,建议英文好的同学直接看这里:https://dev.mysql.com/doc/refman/8.0/en/hash-joins.html
关于MySQL Hash Join的特性介绍:
- 1、对于大数据量的表关联,HJ(Hash Join)速度将明显比NL(Nested Loop)快很多
- 2、在内存中处理
- 3、必要情况下,会使用磁盘空间
- 4、用于内连接,可扩展到外连接、半连接和反连接
- 5、替换查询计划中的Block Nested Loop
- 6、可以通过HINT强制SQL走HJ或者NL
有的同学可能已经懵逼了。什么是Hash Join?什么是NL?HINT又是什么鬼?
部分先做一个简单的科普
首先,在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式。多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join。
肯定有人说,阿里巴巴规范上都说了,并发情况下不能用多表查询。你有多大并发?任何一个系统的后台都会用到多表联合查询。
Hash Join 在Spark 和 Flink的SQL部分进行Join的时候都会被用到,之前我们发过一篇文章:
[Spark SQL Join的三种实现方式]。
Hash Join散列连接是CBO做大数据集连接时的常用方式,而且通常适合大小表之间进行Join。一般来说,使用小表利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。
有的同学又懵逼了。CBO是什么?这里我们就不展开了,简单的说CBO是一种SQL优化方式,它会根据真实的数据情况,评估执行计划,选择代价小的执行计划。
什么是执行计划?百度去吧...[黑人问号脸]
那什么是Nested Loops?简单的说就是两层循环,用张表做Outter Loop,第二张表做Inner Loop,Outter Loop的每一条记录跟Inner Loop的记录作比较,找出符合条件的数据。当然Nested Loops有多种情况。我们举个简单的例子,伪代码如下:
for (r in R) {
for (s in S) {
if (r satisfy condition s) {
output <r, s>;
}
}
}
相关文章