开发者社区> 问答> 正文

何时在MySQL上使用STRAIGHT_JOIN?mysql

我刚遇到一个非常复杂的查询,要花8秒钟才能运行。EXPLAIN显示了一个奇怪的表顺序,即使使用FORCE INDEX提示也没有全部使用我的索引。我遇到了STRAIGHT_JOIN连接关键字,并开始用它替换一些INNER JOIN关键字。我注意到速度有了很大提高。最终,我为此查询将所有INNER JOIN关键字替换为STRAIGHT_JOIN,它现在可以在0.01秒内运行。

我的问题是何时使用STRAIGHT_JOIN,何时使用INNER JOIN?如果您编写良好的查询,是否有任何理由不使用STRAIGHT_JOIN?

展开
收起
保持可爱mmm 2020-05-17 12:05:29 530 0
1 条回答
写回答
取消 提交回答
  • 我不建议在没有充分理由的情况下使用STRAIGHT_JOIN。我自己的经验是,MySQL查询优化器选择不良的查询计划的频率比我想要的要多,但不足以使您通常绕开它,如果您始终使用STRAIGHT_JOIN,这就是您要做的。

    我的建议是将所有查询保留为常规联接。如果发现一个查询正在使用次优查询计划,建议您先尝试重写或重新组织查询,以查看优化程序是否会选择更好的查询计划。另外,至少对于innodb,请确保不仅仅是索引统计信息已过期(ANALYZE TABLE)。这可能会导致优化器选择不良的查询计划。优化器提示通常应该是您的最后选择。

    不使用查询提示的另一个原因是,随着表的增长,您的数据分布可能会随时间变化,或者索引选择性可能会发生变化等。您的查询提示现在是最佳的,随着时间的流逝可能会变得不理想。但是由于您现在已经过时的提示,优化器将无法适应查询计划。如果允许优化器做出决策,则可以保持更大的灵活性。来源:stack overflow

    2020-05-17 12:05:48
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像