MySQL 8.0新特性之哈希连接(散列连接)

  

MySQL开发组于2019年10月14日正式发布了MySQL 8.0.18 GA版本,带来了一些新特性和增强功能,其中最引人注目的莫过于多表连接查询支持散列连接方式了。我们先来看看官方的描述:

  

MySQL实现了用于内连接查询的散列连接方式,例如,从MySQL 8.0.18开始以下查询可以使用散列连接进行连接查询:

        SELECT *   从t1   加入t2>   CREATE TABLE t1 (c1 INT, INT c2);   创建表t2 (c1 INT, INT c2);   创建表t3 (c1 INT, INT c2);      

使用解释格式=树命令可以看到执行计划中的散列连接,例如:

        mysql>解释格式=树   →SELECT *   →从t1   →加入t2   →>   SELECT *   从t1   加入t2>   mysql>解释格式=树   →SELECT *   →从t1   →加入t2   →>   mysql>解释格式=树   →SELECT *   →从t1   →加入t2   →>   mysql>解释   →SELECT *   →从t1   →加入t2   →>   mysql>解释格式=树   →SELECT *   →从t1   →加入t2   →在t1。c2的在50 G \   * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行 ***************************   解释:→内心的散列连接(成本=0.70=1行)   →表扫描>   设置join_buffer_size=2097152000;   设置@@cte_max_recursion_depth=99999999;   插入t1   ——插入t2   ——插入t3   递归t (   选择1 c1, c2   UNION ALL   选择t。c1 + 1, t。c1 * 2   从t   在t。c1 & lt;1000000   )   SELECT *   从t;      

没有索引情况下的散列连接:

        mysql>解释分析   →SELECT COUNT (*)   →从t1   →加入t2   →>   mysql>解释格式=树   →选择/* + NO_HASH_JOIN (t1、t2、t3) */COUNT (*)   →从t1   →加入t2   →>   mysql>创建索引idx1>   mysql>解释分析   →SELECT COUNT (*)   →从t1   →加入t2   →(t1。c1=t2 . c1)   →加入t3   →(t2。c1=t3.c1) \ G   * * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行 ***************************   解释:→总:数(0)(实际时间=47684.034=1 . . 47684.035行循环=1)   →嵌套循环内连接(成本=2295573.22=998412行)(实际时间=0.116 . .=1000000循环=1 46363.599行)   →嵌套循环内连接(成本=1198056.31=998412行)(实际时间=0.087 . .=1000000循环=1 25788.696行)   →过滤:(t1。c1是not null)(成本=100539.40=998412行)(实际时间=0.050 . .=1000000循环=1 5557.847行)   →索引扫描在t1使用idx1(成本=100539.40=998412行)(实际时间=0.043 . .=1000000循环=1 3253.769行)   →索引查找使用idx2 t2 (c1=t1 . c1)(成本=1.00=1行)(实际时间=0.012,0.015行=1循环=1000000)   →索引查找使用idx3 t3 (c1=t1 . c1)(成本=1.00=1行)(实际时间=0.012,0.015行=1循环=1000000)      1行集(47.68秒)      mysql>SELECT COUNT (*)   →从t1   →加入t2   →(t1。c1=t2 . c1)   →加入t3   →(t2。c1=t3.c1);   +----------+   | | COUNT (*)   +----------+   | 1000000 |   +----------+   1行集(19.56秒)      

实际运行花费了19.56秒,所以在我们这个场景中的测试结果如下:

  

           散列连接(无索引)   块嵌套循环(无索引)   块嵌套循环(有索引)               12.98秒   未返回   19.56秒            

  

再增加一个Oracle 12 c中无索引时散列连接结果:1.282 s。

  

再增加一个PostgreSQL 11.5中无索引时散列连接结果:6.234 s。

  

再增加一个SQL 2017中无索引时散列连接结果:5.207 s。

  

  

以上所述是小编给大家介绍的MySQL 8.0新特性之哈希连接(散列连接),希望对大家有所帮助,如果大家有任何疑问请给我留的言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

MySQL 8.0新特性之哈希连接(散列连接)