假设我正在运行具有以下内容的查询:
WHERE column1 = "value1"
AND column2 = "value2"
column1
已编入索引,而column2
则未编入索引。我的WHERE
条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL是否足够智能,可以首先自动查询索引列?
答案 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子句。