【问题标题】:Order of WHERE constraints in query [duplicate]查询中 WHERE 约束的顺序 [重复]
【发布时间】:2012-10-20 23:38:07
【问题描述】:

可能重复:
Does the order of fields in a WHERE clause affect performance in MySQL?

WHERE 子句中元素的顺序会改变查询的速度吗?

我有以下几点:

SELECT * FROM table1 WHERE a<b

。这将返回 500 条记录。

SELECT * FROM table1 WHERE c<d

。这将返回 130000000 条记录。

现在,如果您可以选择:

SELECT * FROM table1 WHERE a<b AND c<d

SELECT * FROM table1 WHERE c<d AND a<b

这两个查询中哪一个会更快?顺序重要吗?

【问题讨论】:

  • 谓词的顺序没有区别。
  • 但是mysql不是一个接一个地做约束。在这种情况下,我猜第一个会更快,因为它为第二个约束留下了更少的条目?
  • 我可能会得到一个幸运的结果。我想确定...
  • 经验测试是唯一的方法来确定...

标签: php mysql


【解决方案1】:

唯一会影响性能的是索引。

如果您在(a, c) 上有一个索引,则WHERE c &lt; d AND a &lt; b 的谓词会运行得更慢,因为索引是从左到右的。

如果您没有索引,则顺序无关紧要。

【讨论】:

  • 当然。查询的速度取决于表的索引和表运行的引擎。
  • 在编辑后删除了反对票,但如果这是正确的并且 MySQL 无法重新排列谓词,它会感到惊讶。
  • @MartinSmith 谢谢。我更熟悉 SQL Server 的性能,而且我知道如果顺序不符合索引的“从左到右”的顺序,则该索引将被使用。
  • 问题是关于c &lt; d AND a &lt; ba &lt; b AND c &lt; d。它们是相同的谓词,只是顺序相反。在 SQL Server 中,它们在查询中出现的顺序绝对没有任何区别。
  • @njk - 是的,列顺序很重要在索引定义中(如果您在last name, first name 上有索引,它不会帮助查询名字)但问题是关于重新排列查询中的相同谓词。如果您将查询编写为 last-name='foo' and first_name='bar'first-name='bar' and last_name='foo',SQL Server 不会在意
【解决方案2】:

不,没有区别。就像在数学中一样,A + B = B + C。这只是意味着互换两者没有任何区别。

【讨论】:

  • 我相信他说的是查询的速度,而不是结果集。
  • @Darrrrrren 我没有说结果集。我只是说明互换两者没有任何区别。
【解决方案3】:

我认为不会有任何区别,无论如何都会被sql优化。 有关此问题的更多信息:Does the order of fields in a WHERE clause affect performance in MySQL?

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多