MySQL加入表格的顺序是什么,它是如何选择的以及STRAIGHT_JOIN何时派上用场?
答案 0 :(得分:2)
MySQL
只能执行嵌套循环(可能使用索引),因此如果两个连接表都已编制索引,则如果A * log(B)
处于领先状态,则联接时间将计算为A
如果B * log(A)
领先,则B
。
很容易看出,满足WHERE
条件的记录较少的表应该是领先的。
还有一些其他因素会影响加入效果,例如WHERE
条件,ORDER BY
和LIMIT
条款等。MySQL
会尝试预测加入时间订单,如果统计数据是最新的,那就很好了。
STRAIGHT_JOIN
非常有用。
例如,以下空间连接:
SELECT *
FROM a
JOIN b
ON MBRContains(a.area, b.area)
受联接交换(较小的表位于前导),但MBRContains
未转换为MBRWithin
且生成的计划不使用索引。
在这种情况下,您应该使用STRAIGHT_JOIN
明确设置连接顺序。
答案 1 :(得分:2)
正如其他人已经说过优化器以及哪些表可能符合较小结果集的标准,但这可能并不总是有效。因为我一直在使用gov't contract / grants数据库。该表是大约1400多万条记录。但是,它也有超过20个查询表(州,国会选区,商业分类类型,所有者种族等)
无论如何,对于这些较小的表,连接使用其中一个小查找,返回主表,然后加入所有其他表。它将数据库CHOKED并在30多个小时后取消查询。由于我的主表被列为FIRST,并且所有后续的表都被查找并加入了AFTER,只需在顶部强制添加STRAIGHT_JOIN我已经列出的顺序和复杂的查询在大约2小时内再次运行(预计所有必须做的事情)
在我发现的所有后续附加内容后,获取您的主要基础到顶部,绝对有帮助。
答案 2 :(得分:1)
表的顺序由优化程序指定。当优化器错误时,Straight_join会派上用场,这种情况并不常见。我在一个大连接中只使用过一次,优化器在连接的第一个位置给了一个特定的表(我在explain select命令中看到它),所以我放置了表,以便稍后在连接中加入它。它帮助很多来加速查询。