Select

SQL 和多個索引

  • June 28, 2012

考慮下表:

i | a | b | c
--------------
0 | 1 | 2 | 3
1 | 4 | 5 | 6
2 | 7 | 8 | 9
3 | x | y | z

最後,該表將有幾千行,甚至比這裡描述的更多列(20+)。我計劃向表中添加索引,但無法確定要創建哪些索引。最後,我將使用這些不同的組合執行 SELECT 語句,有時僅在 1 列上。是製作索引的最有效方法:

(A) 分別索引每一列,例如。aIndex(a)、bIndex(b)、cIndex(c) 等。

(B) 每種選擇語句的索引,例如。aIndex(a)、abIndex(a,b)、acIndex(a,c) 等。

(C) 只需將它們全部索引為一個,例如。tIndex(a,b,c)。

索引是我仍在掌握的那些東西之一,所以如果這看起來是一個愚蠢或簡單的問題,我深表歉意。我要避免的是不必要的索引,因為它們會顯著增加磁碟空間和 INSERT 時間。

最好使用這些技術的任意組合,但將它們與您的實際查詢相匹配。一些查詢可能只需要一個單列索引,而其他查詢可能需要一個多列索引。這是索引的一大優點,您可以根據需要添加它們,並刪除不再起作用的索引,這樣您就可以準確地獲得查詢所需的內容。

僅僅擁有表定義和一些粗略的範例可能不足以讓您獲得想要的答案。您需要知道哪些查詢將被最頻繁地使用。

例如,您只有 1 個聚集索引,這是最強大的索引,因此您只有一個選項。

您的所有/大部分查詢是否可能涉及特定列(i?)?你加入其他表嗎?在一個共同的列上?這會讓我認為我應該是聚集索引中的第一列。該索引中的後續列應該是下一個最常用的列(考慮基數)。如果願意,您可以將所有列放在聚集索引中,因為這實際上是數據儲存的順序。所以列的順序是 NB。

然後,單列索引可以引用聚集索引,這會有所幫助。但是您對那些非聚集索引的選擇和列的數量/順序也取決於預期的使用情況。

另外,這是數據條目還是報告表?數據輸入=更多的索引使輸入數據的速度變慢。報告 = 如果需要的話,把它索引出來!

引用自:https://dba.stackexchange.com/questions/20124