MySQL新特性之哈希连接( 二 )

输出为:
| -> Inner hash join (city.province_id = province.province_id)(cost=1333.82 rows=1329)-> Table scan on city(cost=0.14 rows=391)-> Hash-> Table scan on province(cost=3.65 rows=34)哈希连接 也可以用到多个 join 的查询中,只要存在等值连接,就可以使用哈希连接 。
例如以下查询:
EXPLAIN FORMAT= TREESELECTcity.name AS city_name,province.name AS province_name,country.name AS country_nameFROMcityJOIN provinceON city.province_id = province.province_idAND city.id < 50JOIN countryON province.province_id = country.id输出为:
| -> Inner hash join (city.province_id = country.id)(cost=23.27 rows=2)-> Filter: (city.id < 50)(cost=5.32 rows=5)-> Index range scan on city using PRIMARY(cost=5.32 rows=49)-> Hash-> Inner hash join (province.province_id = country.id)(cost=4.00 rows=3)-> Table scan on province(cost=0.59 rows=34)-> Hash-> Table scan on country(cost=0.35 rows=1)哈希连接也同样适用于 「笛卡尔积」,即没有指定查询条件,如下:
EXPLAIN FORMAT= TREESELECT*FROMcityJOIN province;输出为:
【MySQL新特性之哈希连接】| -> Inner hash join(cost=1333.82 rows=13294)-> Table scan on city(cost=1.17 rows=391)-> Hash-> Table scan on province(cost=3.65 rows=34) 
 
MySQL 什么情况下不会使用哈希连接?

  1. 目前 MySQL 哈希连接只支持内连接,反连接、半连接和外连接仍然使用块嵌套循环执行 。
  2. 如果索引可用,MySQL 会更倾向于使用索引查找来支持嵌套循环;
  3. 当不存在等值查询时,会使用嵌套循环 。
如下:
EXPLAIN FORMAT=TREESELECT*FROMcityJOIN provinceON city.province_id < province.province_id;输出为:
| <not executable by iterator executor>如何查看语句执行是否使用哈希连接?EXPLAIN FORMAT= TREE 在 MySQL 8.0.16 及之后的版本可以使用,TREE 提供了类似于树的输出,对查询处理的描述比传统格式更加精确,它是唯一显示 哈希连接 用法的格式 。
除此之外,也可以使用 EXPLAIN ANALYZE 查看 哈希连接 信息 。
<hr/> 以上基于 MySQL community Server 8.0.18 。




推荐阅读