假设我正在运行一个包含以下内容的查询:
WHERE column1 = "value1"
AND column2 = "value2"
Run Code Online (Sandbox Code Playgroud)
column1被索引,而column2不是.我的WHERE条款的顺序是否重要?我应该首先在索引列上运行子查询吗?或者,SQL是否足够智能,可以首先自动查询索引列?
SQL语句中的顺序无关紧要,当然不适用于未覆盖索引的索引(多个列).
覆盖索引要求查询中至少有一列的引用,从列表的左侧开始.IE:定义为"column1,column2,column3"的覆盖索引需要查询至少引用column1才能使用索引.只引用column2或column2和column3组合的查询不会使用覆盖索引.
也就是说,优化器的索引决策由表统计信息以及查询时索引的碎片程度决定.这些都不是自我维护的,因为根据数据量可能非常耗时(因此您不希望它一直发生).拥有索引并不能保证始终使用索引.
索引也不是ANSI,但令人惊讶的是供应商(MySQL,Oracle等)具有相对类似的语法和命名.
您键入 where 子句的顺序并不重要——数据库的执行计划程序将对此进行排序。
在上面显示的示例中,将首先查找与column1 匹配的每一行,因为它已建立索引,然后检查column2 的值。