我刚遇到一个非常复杂的查询,要花8秒钟才能运行。EXPLAIN显示了一个奇怪的表顺序,即使使用FORCE INDEX提示也没有全部使用我的索引。我遇到了STRAIGHT_JOIN连接关键字,并开始用它替换一些INNER JOIN关键字。我注意到速度有了很大提高。最终,我为此查询将所有INNER JOIN关键字替换为STRAIGHT_JOIN,它现在可以在0.01秒内运行。
我的问题是何时使用STRAIGHT_JOIN,何时使用INNER JOIN?如果您编写良好的查询,是否有任何理由不使用STRAIGHT_JOIN?
我不建议在没有充分理由的情况下使用STRAIGHT_JOIN。我自己的经验是,MySQL查询优化器选择不良的查询计划的频率比我想要的要多,但不足以使您通常绕开它,如果您始终使用STRAIGHT_JOIN,这就是您要做的。
我的建议是将所有查询保留为常规联接。如果发现一个查询正在使用次优查询计划,建议您先尝试重写或重新组织查询,以查看优化程序是否会选择更好的查询计划。另外,至少对于innodb,请确保不仅仅是索引统计信息已过期(ANALYZE TABLE)。这可能会导致优化器选择不良的查询计划。优化器提示通常应该是您的最后选择。
不使用查询提示的另一个原因是,随着表的增长,您的数据分布可能会随时间变化,或者索引选择性可能会发生变化等。您的查询提示现在是最佳的,随着时间的流逝可能会变得不理想。但是由于您现在已经过时的提示,优化器将无法适应查询计划。如果允许优化器做出决策,则可以保持更大的灵活性。