mysql hash join_MySQL支持hash join的使用和优化

ON (t1.c1 = t2.c1)

JOIN t3

ON (t2.c1

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: t1

partitions: NULL

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1

filtered: 100.00

Extra: NULL

*************************** 2. row ***************************

id: 1

select_type: SIMPLE

table: t2

partitions: NULL

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1

filtered: 100.00

Extra: Using where; Using join buffer (Block Nested Loop)

*************************** 3. row ***************************

id: 1

select_type: SIMPLE

table: t3

partitions: NULL

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 1

filtered: 100.00

Extra: Using where; Using join buffer (Block Nested Loop)

3 rows in set, 1 warning (0.01 sec)

哈希联接也适用于笛卡尔乘积,即未指定联接条件时,如下所示:

EXPLAIN FORMAT=TREE

SELECT *

FROM t1

JOIN t2

WHERE t1.c2 > 50\G

(root@localhost:)[test]> EXPLAIN FORMAT=TREE

->       SELECT *

->          FROM t1

->         JOIN t2

->          WHERE t1.c2 > 50\G

*************************** 1. row ***************************

EXPLAIN: -> Inner hash join  (cost=0.70 rows=1)

-> Table scan on t2  (cost=0.35 rows=1)

-> Hash

-> Filter: (t1.c2 > 50)  (cost=0.35 rows=1)

-> Table scan on t1  (cost=0.35 rows=1)

1 row in set (0.00 sec)

默认情况下,等值条件下MySQL尽可能使用哈希联接。也可以用以下两种方式之一控制是否使用哈希联接:

在全局或会话级别上,通过使用 hash_join=on或 hash_join=off作为optimizer_switch 服务器系统变量设置的一部分。默认值为 hash_join=on。

通过使用优化器hint提示强制走HASH_JOIN或 NO_HASH_JOIN作为给表连接算法。

哈希联接的内存使用情况可以使用join_buffer_size系统变量来控制 ;哈希联接不能使用超过此数量的内存。当散列连接所需的内存超过可用容量时,MySQL需要通过使用磁盘上的文件来处理,这时候性能会受到影响。如果发生这种情况,应该会想到如果哈希联接无法容纳到内存中并且创建的文件数超过设置的数量,联接可能不会成功 open_files_limit。为避免此类问题,请进行以下任一更改:

增加join_buffer_size以使哈希联接尽量使用内存中完成,而不是较换到磁盘。

增加open_files_limit。

--The end!

阅读(3996) | 评论(0) | 转发(0) |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值