将表1(外键)中的2列连接到表2(主键) - 如何避免JOIN BUFFER?

时间:2013-12-17 03:32:31

标签: mysql sql join inner-join

Schema:
CALL (ID,USER_ID(Foreign key),SP_USER_ID(Foreign key))
USER (ID,NAME)

查询1:

SELECT u.name, 
       v.name 
FROM   call c 
       INNER JOIN USER u 
               ON c.user_id = u.id 
       INNER JOIN USER v 
               ON c.sp_user_id = v.id 

查询2:

SELECT u.name 
FROM   call c 
       INNER JOIN USER u 
               ON c.user_id = u.id 

查询2工作正常,结果也很快。

但查询1需要花费大量时间,有时MySQL客户端崩溃(看到解释计划,它显示其中一个USER表的“JOIN BUFFER”)。

“在哪里”SP_USER_ID或USER_ID上的条件稍微给出了结果,但它不在可接受的范围内。“其中”其他列的条件没有任何影响。

如何避免JOIN BUFFER在这种情况下获得更快的结果并通过连接或其他方式获得所需的结果?

1 个答案:

答案 0 :(得分:1)

希望有一个索引超过USER_ID列,而不是SP_USER_ID列。因此它选择了JOIN BUFFER

根据文档,仅当联接类型为JOIN BUFFERALL时(换句话说,当不能使用任何可能的密钥时),才会使用index

http://dev.mysql.com/doc/internals/en/join-buffer-size.html