2011-09-05 88 views
4

假设我跑,有一个查询:对于索引选择,WHERE子句中的列顺序是否重要?

WHERE column1 = "value1" 
    AND column2 = "value2" 

column1被索引,并且column2不是。我的WHERE条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL有足够的智能来自动查询索引列吗?

+2

你在说什么SQL的味道? – NullUserException

+0

您使用的是什么版本的SQL? mySQL,SQL Server,Oracle?大多数优化器将使用索引列,但其中很大一部分取决于字段的基数。 – Sparky

+3

这个例子非常通用,实际上它并不重要。任何味道都会以同样的方式充分优化。而且,没有人会知道第2列的基数,因为它没有索引。 –

回答

1

您键入where子句的顺序无关紧要 - 数据库的执行计划程序将对此进行排序。

在上面显示的示例中,匹配column1的每一行都将首先被查找,因为它被索引,然后检查了column2的值。

0

如果我没记错的话子句的顺序并不重要。它是同一执行计划的所有部分,因此如果您查看exec计划,您将注意到无索引字段上的where子句将非常昂贵,无论您输入的顺序如何。

如果它是高度查询你最好在非聚集索引中使用该字段,或者至少在索引中使用包含子句。

6

SQL语句中的顺序无关紧要,当然不适用于不覆盖索引(多于一列)的索引。

覆盖索引要求在查询中至少有一列从列表左侧开始有引用。 IE:定义为“column1,column2,column3”的覆盖索引需要至少引用column1以便使用索引的查询。只有引用了column2或column2和column3的组合的查询不会使用覆盖索引。

也就是说,优化器决定的索引是由表统计确定的。&索引在查询时是多么碎片化。这些都不是自我维护的,因为根据数据量可能非常耗时(所以你不希望它始终发生)。拥有索引并不能保证索引总是被使用。

索引也不是ANSI,但令人惊讶的是,供应商(MySQL,Oracle等)具有相对相似的语法&命名。

1

对于查询,无论这些是最优的:

INDEX(column1, column2) 
INDEX(column2, column1) 

的东西,在WHERE的顺序并不重要;在INDEX列的顺序确实事情,有时很多。

基数无关紧要。

More on creating optimal indexes for MySQL;其中大部分应该与其他引擎相关。

+0

谢谢,这正是我一直在寻找的。 – another

相关问题