Mysql 什么时候使用直线连接?

Mysql 什么时候使用直线连接?,mysql,join,Mysql,Join,MySQL连接表的顺序是什么,它是如何选择的,什么时候可以使用直接连接?表的顺序由优化器指定。当优化器出错时,直接连接很方便,但这种情况并不常见。我只在大型联接中使用过一次,优化器在联接的第一个位置给出了一个特定的表(我在explain select命令中看到了它),因此我放置了该表,以便稍后在联接中联接它。它大大加快了查询速度 MySQL只能够执行嵌套循环(可能使用索引),因此如果两个联接表都被索引,则联接的时间计算为A*log(B)如果A是前导的,而B*log(A)如果B是前导的 很容易看出

MySQL连接表的顺序是什么,它是如何选择的,什么时候可以使用直接连接?

表的顺序由优化器指定。当优化器出错时,直接连接很方便,但这种情况并不常见。我只在大型联接中使用过一次,优化器在联接的第一个位置给出了一个特定的表(我在explain select命令中看到了它),因此我放置了该表,以便稍后在联接中联接它。它大大加快了查询速度

MySQL
只能够执行嵌套循环(可能使用索引),因此如果两个联接表都被索引,则联接的时间计算为
A*log(B)
如果
A
是前导的,而
B*log(A)
如果
B
是前导的

很容易看出,满足
WHERE
条件的记录较少的表应设为前导

还有一些其他因素会影响连接性能,例如
WHERE
条件、
orderby
LIMIT
子句等。
MySQL
尝试预测连接顺序的时间,如果统计信息是最新的,那么它会做得很好

当统计数据不准确(例如,自然倾斜)或优化器中出现错误时,
直联
非常有用

例如,以下空间连接:

SELECT  *
FROM    a
JOIN    b
ON      MBRContains(a.area, b.area)
要进行连接交换(较小的表处于前导位置),但是,
mbracontains
不会转换为
mbrinsin
,并且生成的计划不会使用索引


在这种情况下,您应该使用
stright\u join

明确设置联接顺序,正如其他人所述,优化器以及哪些表可能满足较小结果集的条件,但这可能并不总是有效的。因为我一直在使用政府合同/赠款数据库。这张表大约有1400多万条记录。然而,它也有20多个查找表(州、国会选区、企业分类类型、所有者种族等)

不管怎样,对于这些较小的表,连接使用一个小查找,返回到主表,然后连接所有其他表。它阻塞了数据库,并在30多小时后取消了查询。因为我的主表是首先列出的,所有后续的查询都是在后面查找和联接的,所以只需在顶部添加直联就可以强制执行我列出的顺序,并且复杂查询在大约2小时内再次运行(这是它必须做的)


我发现,无论你的主要基础是什么,通过随后的所有额外活动,都能达到顶峰,这肯定会有帮助。

类似的问题:但原因是什么?这与常识无关,或者我错过了什么;)表连接时间公式中的对数基数是多少?你在说什么统计数据?在mysql中还没有听说过它:(@Zapadlo:lography base取决于几个因素,包括索引稀疏性和记录大小。统计数据存储在
信息\u模式中。统计数据