2011-07-12 36 views
3

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

+0

相似问题:http://stackoverflow.com/questions/512294/when-to-use-straight-join-with-mysql – Jake

回答

2
MySQL

仅能够操作的方式嵌套循环(可能使用索引)的,因此,如果两个连接表进行索引,时间为联接如果A是领先和B * log(A)如果B是导致被计算为A * log(B)

很容易看到满足WHERE条件的记录较少的表应该处于领先地位。

有迹象表明,影响连接性能的一些其他因素,如WHERE条件,ORDER BYLIMIT条款等MySQL试图预测时间为连接顺序,如果统计数据是最新的做它相当不错。

STRAIGHT_JOIN在统计信息不准确(比如说,自然倾斜)或优化程序中出现错误时非常有用。

例如,下面的空间连接:

SELECT * 
FROM a 
JOIN b 
ON  MBRContains(a.area, b.area) 

是受一个连接交换(越小表由主导),然而,MBRContains不转换为MBRWithin并将所得计划不使用的指数。

在这种情况下,您应该使用STRAIGHT_JOIN明确设置连接顺序。

+0

什么是表连接时间公式中的对数基数? – zapadlo

+0

你在说什么统计数据?在mysql中没有听说过它:( – zapadlo

+0

@Zapadlo:对数基数取决于几个因素,包括索引稀疏性和记录大小,统计信息存储在'INFORMATION_SCHEMA.STATISTICS'中。 – Quassnoi

1

表的顺序由优化程序指定。当优化器错误时,Straight_join派上用场,这种情况并不常见。我只在一次大连接中使用了它,优化器在连接中首先给出了一个特定的表(我在explain select命令中看到了它),所以我放置了表,以便稍后在连接中加入。它帮助很多加快查询。

2

正如其他人所说的关于优化器和哪些表可能符合较小结果集的标准,但这可能并不总是奏效。正如我一直在与政府合同/赠款数据库一起工作。这张表是大约1400多万条记录。然而,它也有超过20个查询表(州,国会区,业务分类类型,业主种族等)

无论如何,与这些较小的表,连接是使用其中一个小查找,回到主表然后加入其他所有人。它检查了数据库并在30多个小时后取消了查询。由于我的主表是FIRST,所有后来的查找和加入后,只需添加STRAIGHT_JOIN顶部FORCED我已列出的顺序和复杂的查询再运行约2小时(预计所有必须做的) 。

无论你的主要基础是什么,以后我发现的所有后续额外功能绝对有帮助。

+1

但是什么原因?它不相关有常识,或者我想念一些事情;) – zapadlo