输出为:
| -> 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 什么情况下不会使用哈希连接?
- 目前 MySQL 哈希连接只支持内连接,反连接、半连接和外连接仍然使用块嵌套循环执行 。
- 如果索引可用,MySQL 会更倾向于使用索引查找来支持嵌套循环;
- 当不存在等值查询时,会使用嵌套循环 。
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 。
推荐阅读
- 作为一名小白,如何学习新媒体运营
- 东和大益普洱茶价格,大益普洱茶最新价格价格表
- 新手篇 DEDE织梦网站安装+还原数据详细教程
- 编程到底难不难学?新手入门选择哪种语言好?
- 乔治娜c罗结婚了吗 乔治娜和c罗的最新照片
- MySQL 聚集索引和二级索引
- 新手如何选购阿里云服务器
- 今日最新开化龙顶茶价格礼盒装多少钱一盒
- 淘宝月销量显示规则 淘宝店新规则1月1号实行
- 住了三年的新房,还越住越省心,全靠装修时做这8个“新潮”决定