2017-08-01 55 views
0

只是爲了更好地瞭解在哪些情況下索引正確使用我想列舉可能的情況。我們假設我們有一個「a」,「b」,「c」,「d」列的表格。postgres:當使用索引

我們創建(A,B,C,d)的索引:

create index my_index on table my_table (a, b, c, d) 

是當用於

1)

where a=% and b=% and c=% and d=% 

2)

where a=% and b=% 

3)

where a=% 

4)

where b=% and c=% and d=% 

5)

where c=% order by b 

6)

where a=% and b=% and c=% order by case when d is not null then d else c end 

7) 假設現在我們有7個點,但該指數更列僅限於(a,b,c,d)

where a=% and b=% and c=% and d=% and e=% and f=% and g=% 

回答

3

MySQL有很好的解釋多列索引的documentation。規則在數據庫中基本相同(雖然有一些更高級的東西)。

當然,還有其他因素 - 例如from子句中發生了什麼,正在選擇哪些列,關於表的統計信息等等。

以下是基本的指導:

1)where a=% and b=% and c=% and d=%

是的,只要所有條件都平等。我不知道整理衝突會發生什麼。

2)其中a =%和b =%

是,只要所有條件都平等。我不知道整理衝突會發生什麼。

3)其中,a =%

是,只要所有條件都平等。我不知道整理衝突會發生什麼。

4)其中b =%和c =%和d =%

可能不是。如果使用,則需要掃描索引。如果索引涵蓋了查詢,則會是這種情況。

5)其中c =由b排序的%

可能不是。

6)其中,a =%和b =%和c =%爲了通過情況下,當d不爲空則d,否則c結束

應用於where子句。仍然需要排序。

+1

它也取決於值的分佈,如果只有2個可能的值,並且有成千上萬或數百萬記錄,其中a =%可能不會導致索引的使用。 – aschoerk

+0

@aschoerk。 。 。好點子。我澄清了答案。 –

+0

對不起,我添加了一個7)案例編輯 – 91DarioDev