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

Chr*_*ris 4 sql indexing

假设我正在运行一个包含以下内容的查询:

WHERE column1 = "value1" 
  AND column2 = "value2"
Run Code Online (Sandbox Code Playgroud)

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

OMG*_*ies 7

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

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

也就是说,优化器的索引决策由表统计信息以及查询时索引的碎片程度决定.这些都不是自我维护的,因为根据数据量可能非常耗时(因此您不希望它一直发生).拥有索引并不能保证始终使用索引.

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


Jef*_*and 1

您键入 where 子句的顺序并不重要——数据库的执行计划程序将对此进行排序。

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