2011-09-05 89 views
4

假設我跑,有一個查詢:對於索引選擇,WHERE子句中的列順序是否重要?

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

column1被索引,並且column2不是。我的WHERE條款的順序是否重要?我應該首先在索引列上運行子查詢嗎?或者,SQL有足夠的智能來自動查詢索引列嗎?

+2

你在說什麼SQL的味道? – NullUserException

+0

您使用的是什麼版本的SQL? mySQL,SQL Server,Oracle?大多數優化器將使用索引列,但其中很大一部分取決於字段的基數。 – Sparky

+3

這個例子非常通用,實際上它並不重要。任何味道都會以同樣的方式充分優化。而且,沒有人會知道第2列的基數,因爲它沒有索引。 –

回答

1

您鍵入where子句的順序無關緊要 - 數據庫的執行計劃程序將對此進行排序。

在上面顯示的示例中,匹配column1的每一行都將首先被查找,因爲它被索引,然後檢查了column2的值。

0

如果我沒記錯的話子句的順序並不重要。它是同一執行計劃的所有部分,因此如果您查看exec計劃,您將注意到無索引字段上的where子句將非常昂貴,無論您輸入的順序如何。

如果它是高度查詢你最好在非聚集索引中使用該字段,或者至少在索引中使用包含子句。

6

SQL語句中的順序無關緊要,當然不適用於不覆蓋索引(多於一列)的索引。

覆蓋索引要求在查詢中至少有一列從列表左側開始有引用。 IE:定義爲「column1,column2,column3」的覆蓋索引需要至少引用column1以便使用索引的查詢。只有引用了column2或column2和column3的組合的查詢不會使用覆蓋索引。

也就是說,優化器決定的索引是由表統計確定的。&索引在查詢時是多麼碎片化。這些都不是自我維護的,因爲根據數據量可能非常耗時(所以你不希望它始終發生)。擁有索引並不能保證索引總是被使用。

索引也不是ANSI,但令人驚訝的是,供應商(MySQL,Oracle等)具有相對相似的語法&命名。

1

對於查詢,無論這些是最優的:

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

的東西,在WHERE的順序並不重要;在INDEX列的順序確實事情,有時很多。

基數無關緊要。

More on creating optimal indexes for MySQL;其中大部分應該與其他引擎相關。

+0

謝謝,這正是我一直在尋找的。 – another

相關問題