什么时候使用straight_join?

时间:2011-07-12 20:13:22

标签: mysql join

MySQL加入表格的顺序是什么,它是如何选择的以及STRAIGHT_JOIN何时派上用场?

3 个答案:

答案 0 :(得分:2)

MySQL只能执行嵌套循环(可能使用索引),因此如果两个连接表都已编制索引,则如果A * log(B)处于领先状态,则联接时间将计算为A如果B * log(A)领先,则B

很容易看出,满足WHERE条件的记录较少的表应该是领先的。

还有一些其他因素会影响加入效果,例如WHERE条件,ORDER BYLIMIT条款等。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命令中看到它),所以我放置了表,以便稍后在连接中加入它。它帮助很多来加速查询。