WHERE子句中的Column Order对索引选择是否重要?

时间:2011-09-05 17:18:57

标签: sql indexing

假设我正在运行具有以下内容的查询:

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

column1已编入索引,而column2则未编入索引。我的WHERE条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL是否足够智能,可以首先自动查询索引列?

4 个答案:

答案 0 :(得分:7)

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

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

也就是说,优化器的索引决策由表统计和&amp ;;索引在查询时的碎片程度。这些都不是自我维护的,因为根据数据量可能非常耗时(所以你不希望它一直发生)。索引不保证始终使用索引。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

对于 查询,其中任何一个都是最佳的:

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

WHERE中的事物顺序并不重要; INDEX 中列的顺序很重要,有时很多。

基数并不重要。

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

答案 3 :(得分:0)

如果我没记错的话,条款的顺序并不重要。它是同一个执行计划的所有部分,所以如果你查看exec计划,你会注意到非索引字段的where子句将非常昂贵,无论你把它放在哪个顺序。

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