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) |