首页 > 互联资讯 > 技术交流  > 

MySQL数据库Hash Join

MySQL数据库Hash Join

1、什么是 Hash Join

MySQL中的第二个 JOIN 是 Hash JOIN,当两个表之间的连接条件没有索引时使用该算法。

如果没有连接,那么创建索引可以吗?

如果某些列是选择性低的索引,则在创建索引以导入数据时必须对数据进行排序,这会影响导入性能;辅助索引将出现返回表的问题。如果过滤的数据量很大,直接全表扫描会更快。

对于OLAP业务查询(OLAP 是在线分析处理,用于数据分析,它使我们能够同时分析来自多个数据库系统的信息),哈希连接是一个必不可少的功能。MySQL 8.0开始支持 Hash Join算法,加强了对 OLAP 业务的支持。

因此,如果您的查询数据量不太大,并且查询的响应时间要求在分钟级别,则可以使用单实例MySQL 8.0来完成大数据的查询。

2、Hash JOIN 工作原理

Hash JOIN出现在MySQL 8.0的执行计划中,Hash JOIN 扫描关联的两个表:首先,在扫描驱动器表的过程中创建一个哈希表;当扫描第二个表时,将在哈希表中搜索每个关联记录。如果找到,将返回记录。

哈希连接选择驱动程序表和嵌套循环连接算法,两者基本相同。两个较小的表都用作驱动程序表.如果驱动器表很大,并且创建的哈希表超过了内存大小,MySQL将自动将结果转储到磁盘。

子查询

我发现相当多的开发同学,包括我自己更喜欢编写子查询,而不是传统的JOIN语句。

子查询的逻辑非常清晰。虽然 JOIN 也可以满足需求,但这并不容易理解,因为LEFT JOIN是一种代数关系,子查询更倾向于从人类思维的角度来理解。

然而,在MySQL 8.0中,优化器会自动将 in 子查询优化为 JOIN 执行计划,这将显著提高性能。

我们只需要关注SQL执行计划,如果两个执行计划相同,则性能没有差异。

在MySQL 8.0之前,MySQL没有完全优化子查询。因此,您将在子查询的执行计划中看到DEPENDENT SUBQUERY的提示,这表明它是一个从属子查询,子查询需要依赖外部表的关联。DEPENDENT SUBQUERY的执行速度可能非常慢,而且大多数时候您需要手动将其转换为两个表之间的连接。

所以这里博主提示大家,如果你的当前的MySQL 8.0版本可以编写子查询,因为子查询的优化相当完整;

对于 MySQL 8.0 之前版本的MySQL,需要查看所有子查询的 SQL 执行计划。对于 DEPENDENT SUBQUERY 的提示,要进行优化,否则将对业务产生重大性能影响;DEPENDENT SUBQUERY的优化通常被重写为用于表连接的派生表。


MySQL数据库Hash Join由讯客互联技术交流栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“MySQL数据库Hash Join