假设我跑,有一个查询:对于索引选择,WHERE子句中的列顺序是否重要?
WHERE column1 = "value1"
AND column2 = "value2"
column1
被索引,并且column2
不是。我的WHERE
条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL有足够的智能来自动查询索引列吗?
假设我跑,有一个查询:对于索引选择,WHERE子句中的列顺序是否重要?
WHERE column1 = "value1"
AND column2 = "value2"
column1
被索引,并且column2
不是。我的WHERE
条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL有足够的智能来自动查询索引列吗?
您键入where子句的顺序无关紧要 - 数据库的执行计划程序将对此进行排序。
在上面显示的示例中,匹配column1的每一行都将首先被查找,因为它被索引,然后检查了column2的值。
如果我没记错的话子句的顺序并不重要。它是同一执行计划的所有部分,因此如果您查看exec计划,您将注意到无索引字段上的where子句将非常昂贵,无论您输入的顺序如何。
如果它是高度查询你最好在非聚集索引中使用该字段,或者至少在索引中使用包含子句。
SQL语句中的顺序无关紧要,当然不适用于不覆盖索引(多于一列)的索引。
覆盖索引要求在查询中至少有一列从列表左侧开始有引用。 IE:定义为“column1,column2,column3”的覆盖索引需要至少引用column1以便使用索引的查询。只有引用了column2或column2和column3的组合的查询不会使用覆盖索引。
也就是说,优化器决定的索引是由表统计确定的。&索引在查询时是多么碎片化。这些都不是自我维护的,因为根据数据量可能非常耗时(所以你不希望它始终发生)。拥有索引并不能保证索引总是被使用。
索引也不是ANSI,但令人惊讶的是,供应商(MySQL,Oracle等)具有相对相似的语法&命名。
对于是查询,无论这些是最优的:
INDEX(column1, column2)
INDEX(column2, column1)
的东西,在WHERE
的顺序并不重要;在INDEX
列的顺序确实事情,有时很多。
基数无关紧要。
More on creating optimal indexes for MySQL;其中大部分应该与其他引擎相关。
谢谢,这正是我一直在寻找的。 – another
你在说什么SQL的味道? – NullUserException
您使用的是什么版本的SQL? mySQL,SQL Server,Oracle?大多数优化器将使用索引列,但其中很大一部分取决于字段的基数。 – Sparky
这个例子非常通用,实际上它并不重要。任何味道都会以同样的方式充分优化。而且,没有人会知道第2列的基数,因为它没有索引。 –