【问题标题】:MySQL - AND conditionMySQL - 与条件
【发布时间】:2010-12-15 10:52:51
【问题描述】:

假设我有这样的查询:

SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')...

我想知道 MySQL 在检索结果时是否继续检查所有条件。 例如。如果foo不是LIKE %bar%,是否会继续检查boo = 'bar',以此类推?

如果我把不太可能为真的条件放在最后会不会更快?

如果这似乎是个愚蠢的问题,我很抱歉,我对 SQL 完全是个菜鸟 :)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    我不认为多个条件是否会短路有任何保证,但是...

    一般来说,您应该将查询优化器视为一个黑匣子,并假设(除非您有相反的证据)它会正常工作。优化器的工作是确保尽可能高效地检索请求的数据。如果最有效的计划涉及短路,那么它会这样做;如果没有,那么就不会。

    (当然,查询优化器并不完美。如果您有证据表明查询没有以最佳方式执行,那么通常值得重新排序和/或重新声明查询以查看是否有任何变化。)

    【讨论】:

    【解决方案2】:

    您要查找的是有关 MySQL 短路评估的文档。然而,我找不到比那些无法能够找到文档的人更好的东西,但他们claim 测试过它并发现它是真的,即 MySQL 短-电路。

    如果我把不太可能为真的条件放在最后会不会更快?

    不,优化器将尝试优化(!)处理顺序。所以,对于测试的顺序,你应该假设任何东西。

    【讨论】:

      【解决方案3】:

      我不会指望这一点:Where Optimisations。该链接说明其他标准适用于订单。

      【讨论】:

        【解决方案4】:

        您不能依赖 MySQL 从左到右评估条件(与任何编程语言相反)。这是因为“WHERE 子句优化器”会查找已编入索引的列,并将首先查找此子集。

        有关查询优化,请参阅 MySQL 参考手册中的 Optimizing SELECT Statements 章节。

        【讨论】:

          【解决方案5】:

          如果它在第一个条件失败时发生短路(最有可能),最好将那些最有可能失败的条件放在第一位!

          假设我们有 3 个条件,并且所有条件都必须为真(用 "AND" 分隔)。 慢速案例: 1.永不失败。所有行都经过查看并成功。 2.有时会失败。所有行都经过查看,仍然成功。 3.经常失败。所有行都被查看了,这次我们失败了。 结果:花了一段时间,但找不到匹配项。

          快速案例: 1.经常失败。所有行都被查看并且匹配失败。 2.有时会失败。未查看,因为搜索因短路而结束。 3.永不失败。未查看,因为搜索因短路而结束。 结果:很快就想通了,不匹配。

          如果我错了,请纠正我。 我可以想象,对于每一行看起来的广告,所有条件都会被检查。这使得这件事少了很多。 如果您的字段按与您的条件相同的顺序排序,您可以衡量差异。

          【讨论】:

            猜你喜欢
            • 2020-12-29
            • 1970-01-01
            • 2013-02-11
            • 2014-09-11
            • 2014-08-11
            • 1970-01-01
            • 1970-01-01
            • 2018-02-19
            • 2015-07-08
            相关资源
            最近更新 更多