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在这种情况下获得更快的结果并通过连接或其他方式获得所需的结果?
答案 0 :(得分:1)
希望有一个索引超过USER_ID
列,而不是SP_USER_ID
列。因此它选择了JOIN BUFFER
。
根据文档,仅当联接类型为JOIN BUFFER
或ALL
时(换句话说,当不能使用任何可能的密钥时),才会使用index
。