2017-04-10 21 views
1

我想明白,如果是有意義的有以下情形兩個單獨的索引:索引的數據庫表中,一列普通

ColumnA, ColumnB, ColumnC 

我有疑問

1. where ColumnA = xxx and columnB = xxx 
2. where ColumnA = xxx and ColumnC = xxx 

如果我創建只有一個索引,即在ColumnA,這將有助於這兩個查詢?或者我應該在ColumnA + ColumnBColumnA + ColumnC上創建兩個索引Index1。

我知道有兩個指數可能會更好,但我試圖保持指數低,因爲表是相當大,但columnA是相當獨特的。 ColumnA過濾特定實體的數據,並且該實體只能始終鑽研該數據。

此外,如果有在ColumnA + ColumnB並且如果查詢的索引來在其中ColumnB在第一和第二ColumnA,將這個索引可以使用?

+0

「*如果我只創建一個索引,那是在ColumnA上,這對兩個查詢都有幫助嗎?」*我想你的意思是問你是否應該在ColumnB上創建一個索引?查詢具有ColumnB,而不是ColumnA。 – Schwern

+0

對不起,我想我打錯了。 ColumnA是常見的。 –

回答

2

通常,僅在ColumnA上創建索引應該有助於兩個查詢。大多數RDBMS中的索引(MSSQL,MySQL等)都是b-tree結構。關鍵只允許沿一個方向快速向下看。

此外,在創建更深指數如ColumnA, ColumnC也應該幫助這兩個查詢,因爲ColumnA成分仍然第一個索引。

我會建議評估哪一列最頻繁選擇:ColumnBColumnC並將它應用於ColumnA

一個例子:假設ColumnB僅在ColumnA查詢的10%中被訪問,而ColumnC被訪問90%。在這種情況下,我會在ColumnA, ColumnC上設置索引。它可以幫助100%的AC查詢,並且可能(我在MySQL中不是100%確定的)也幫助AB查詢,因爲系統通常足夠智能(至少在MSSQL中)使用AC索引來選擇AB查詢中的ColumnA數據(但仍對ColumnB組件進行全面掃描)。

這種類型的索引被稱爲,覆蓋索引,因爲您的查詢只選擇包含在索引數據中的列(這也是一個輕微的優化)。

最好的讀取性能將是2個索引(每組一個),但正如您正確指出的那樣,這會減慢插入,更新和刪除一點。儘管如此,在大多數情況下,您還是可能會注意到這一點。

2

(@Haney從一個觀點來看討論的問題;這裏是另一個。)

2索引不是「壞」; 10個指標正進入「太多指標」的灰色地帶。

INDEX(A)幫助與您的兩個查詢。

INDEX(A,B)非常適合您的查詢之一,而幫助與其他查詢。如果你想保持一個索引,這可能是最好的選擇。

但是...如果BTEXT列,則由於大小限制,您將不被允許使用INDEX(A,B)。並且,儘管可能使用「前綴」INDEX(A, B(22)),但可能並不比INDEX(A)更好。

不要打擾INDEX(A,B,C)。這對於使用A和B的查詢很有用,但對於其他查詢而言,它不會比INDEX(A)更好。