2013-12-17 48 views
0
Schema: 
CALL (ID,USER_ID(Foreign key),SP_USER_ID(Foreign key)) 
USER (ID,NAME) 

查询1:从表1(外键)到表2(主键)加入2列 - 如何避免JOIN BUFFER?

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

“where”SP_USER_ID或USER_ID的条件有些快速给出结果,但它不在可接受的范围内。“其中”其他列上的条件没有任何影响。

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

+0

你有三张桌子还是两张桌子?你有另一张Super_User的桌子吗? –

+0

。只有2个表 - CALL和USER.USER表具有所有用户信息.CALL中的USER_ID与客户ID相同,而CALL中的SP_USER_ID与正在服务/参与该客户的个人ID相同。现在,我需要与USER表联合以获取USER_ID和SP_USER_ID的名称。 – user104309

回答

1

希望有一个索引超过USER_ID列,并且不会超过SP_USER_ID列。因此它选择JOIN BUFFER

根据文档,A JOIN BUFFER仅用于连接类型为ALLindex(换句话说,当没有可能的键可以使用时)。

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

+0

我在USER_ID和SP_USER_ID上都有索引。即使在这两列上有索引似乎也没有帮助我。 – user104309