sql - SQL 中 where 子句的顺序重要吗?

标签 sql performance where-clause

假设我有一个名为 PEOPLE 的表,其中包含三列:IDLastNameFirstName。这些列都没有索引。 LastName 更独特,FirstName 不太独特。

如果我进行两次搜索:

select * from PEOPLE where FirstName="F" and LastName="L"
select * from PEOPLE where LastName="L" and FirstName="F"

我相信第二个更快,因为更独特的标准 (LastName) 在 where 子句中排在第一位,并且记录将被更有效地删除。我认为优化器不够聪明,无法优化第一个 SQL 查询。

我的理解正确吗?

最佳答案

不,这个顺序并不重要(或者至少:不应该重要)。

任何像样的查询优化器都会查看WHERE子句的所有部分,并找出满足该查询的最有效方法。

我知道 SQL Server 查询优化器会选择一个合适的索引 - 无论两个条件的顺序如何。我假设其他 RDBMS 也会有类似的策略。

重要的是你是否有合适的索引!

对于 SQL Server,如果您满足以下条件,它可能会使用索引:

  • (姓氏、名字)的索引
  • (名字,姓氏)的索引
  • 仅针对(LastName)或仅针对(FirstName)(或两者)的索引

另一方面 - 同样对于 SQL Server - 如果您使用 SELECT * 从表中获取所有列,并且该表相当小,那么有一个查询优化器很有可能只进行表(或聚集索引)扫描,而不是使用索引(因为查找完整数据页以获取所有其他列很快就会变得过于昂贵)。

关于sql - SQL 中 where 子句的顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11436469/

相关文章:

sql - 在 Microsoft SQL Server 2000 中模拟 MySQL LIMIT 子句

MYSQL 解释给出 "Impossible WHERE"和 SELECT Count(x) 查询

mysql - 创建联接以显示 T1 中不在 T2 中的一列的值,并进行一些比较

sql - 使用子查询比较两个表?

java - 如何在java中向数据库添加 boolean 值

SQL查询日期空检查

sql - 从 NOT EXISTS 转换为 NOT IN

php - 如何粗略估计 LAMP 应用容量?

Java 可变 BigInteger 类

javascript - 我应该删除 Angular watch 吗?