当前位置: 首页 > 面试题库 >

何时在MySQL上使用STRAIGHT_JOIN

狄灵均
2023-03-14
问题内容

我刚遇到一个非常复杂的查询,要花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
)。这可能会导致优化器选择不良的查询计划。优化器提示通常应该是您的最后选择。

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



 类似资料:
  • 问题内容: 希望所有不同用户的所有最新访问。 为此,我正在使用以下查询 正在获取SQL语法错误。 事件表列名称 谁能帮我这个忙 预期的输出是这样的 21是user_id,值是上次访问时间 使用mysql作为数据库 问题答案: 因此,您希望所有用户访问都具有上次访问时间。 取而代之的使用功能,您可以使用与功能。 查询看起来像 这将输出您想要的结果 希望这对您有用。 仅供参考(列)。是PostgreS

  • 问题内容: 在PHP 5中,使用和之间有什么区别? 什么时候合适? 问题答案: 使用来指代当前对象。用指当前类。换句话说, 用于非静态成员,用于静态成员。 完整答案 这里是一个例子 正确 的使用和用于非静态和静态成员变量: 这里是一个例子 不正确 的使用和用于非静态和静态成员变量: 这是带有for成员函数的 多态 示例: 这是通过使用for成员函数来 抑制多态行为 的示例:

  • 问题内容: 我经常发现自己需要使用matplotlib在Python中创建热图样式的可视化效果。Matplotlib提供了几种功能,它们显然可以完成相同的操作。 建议代替但是什么之间的差值(从实用的角度作为数据绘图仪)和?相互使用时的利弊是什么?在哪种情况下,一个或另一个将是明显的赢家? 问题答案: 从根本上讲,假定数组中的所有数据元素均应以相同的大小呈现,而/将数据数组的元素与矩形元素(其大小可

  • 问题内容: 我有一个组件数据库。每个组件都是特定的类型。这意味着组件和类型之间存在多对一的关系。删除类型时,我想删除所有具有该类型外键的组件。但是,如果我没记错的话,级联删除将在删除组件时删除类型。有什么办法可以做我所描述的吗? 问题答案: 这就是您要包含在组件表中的内容。 请记住,您需要使用InnoDB存储引擎:默认的MyISAM存储引擎不支持外键。

  • 问题内容: 我正在编写一个将上载和删除许多文件的应用程序,我通常只是将文件移到服务器中的文件夹中,并用unique行命名它们。但是据我了解,MySQL还可以让我存储二进制数据(文件),何时才是更好的选择? 请使用可靠的参数,例如何时使用BLOB会提高性能? PS:如果重要的话,我正在使用MyISAM。 谢谢。 更新: 相关问题 : - 在DB中存储图像-是或否? - 做或不做:将图像存储在数据库中

  • 问题内容: 我有一个在Java堆栈(Struts 2 + Spring + Hibernate)上运行的Web应用程序,并在MySQL中保持不变。我查看了NoSQL数据库,它们肯定比RDBMS更容易推理和使用。这是一个音乐流应用程序,用于存储艺术家信息并允许用户保存播放列表。 我想知道切换到NoSQL DB(CouchDB,MongoDB,Cassandra)是否有任何优势(性能,硬件成本,简化代