2012-02-22 98 views
4

我使用MYSQL創建一個組合主鍵的表。例如,col_a和col_b一起用作關鍵字。我會經常使用col_a和col_b來獲取行,並且還會分別使用col_a或col_b來查詢一些行。如何爲組合主鍵的表創建索引?

我的問題是,我將如何創建它的索引?我只需要一個複合索引,還是隻需要三個帶有兩個索引的索引?

我想MYSQL會爲主鍵創建索引。但是它會爲(col_a,col_b)創建一個複合索引,還是爲每一列創建一個索引?

回答

6

多列索引

對於多列索引,索引工作由左到右。

鑑於你的主鍵:

(col_a, col_b) 

下面是它可以使用的情況:

  • 爲col_a。在col_a上搜索時可以使用索引,因爲從左到右,col_a是第一列。
  • col_a & col_bYES。在col_a和col_b上搜索時,也可以使用索引,因爲從左到右,它是col_a,然後是col_b。
  • col_b:NO。當只搜索col_b時,索引不能被使用,因爲索引中的第一列是col_a,我們不能跳過列。

給定一個較大的指數是這樣的:

(col_a, col_b, col_c) 
  • 爲col_aYES
  • 爲col_a & col_bYES
  • 爲col_a & col_cNO。不能跳過索引中的col_b。
  • col_b:NO。不能跳過col_a。
  • col_c:NO。不能跳過col_a。
  • col_b & col_cNO。不能跳過索引中的col_a。

覆蓋索引

爲了利用索引作爲"covering" index,左到右圖案仍然適用。

給定索引(col_a, col_b),可以選擇col_a和col_b,但只搜索col_a(或col_a和col_b),並且MySQL可以使用索引來搜索和檢索數據,因爲col_a和col_b都是在索引中。這保存了實際行數據的行程,因爲這些值存儲在索引中。

給定索引(col_a, col_b, col_c),如果僅搜索col_a,並且能夠使用覆蓋索引返回col_c,則無法選擇col_a和col_c,因爲您無法跳過索引中的col_b。相反,MySQL會訪問實際的表數據。但是,如果您在col_a和col_b上搜索,則可以選擇col_a和col_c並將其用作覆蓋索引。

主鍵中的「覆蓋」索引

每個次級索引具有包含在索引中的主鍵。

單列索引,因爲它涉及覆蓋索引,可以被認爲是以下模式的多列索引。鑑於主鍵(col_a, col_b),col_b上的單列索引,看起來像這樣(col_b)(col_a, col_b)

鑑於上述單列索引,您仍然可以選擇col_a和col_b,然後在col_b上進行搜索,並且該索引可以用作覆蓋索引。由於主鍵包含col_a,因此MySQL仍然可以使用索引來返回兩列,而不必擊中實際的表數據。

如果我想搜索col_b,該怎麼辦?

鑑於主鍵(col_a, col_b),如果您只想搜索col_b,則應在col_b上添加單列索引。如上所述,如果您返回col_b和col_a,它仍然可以用作覆蓋索引。

+0

很好的解釋 – Piyuesh 2016-05-25 11:15:49

3

上(爲col_a,col_b)複合主鍵索引會照顧你在哪裏查詢在兩列或查詢只爲col_a情況。對於只有col_b的查詢,您需要一個單獨的索引。

+0

這裏沒有什麼要補充的。移動(+1)... – RolandoMySQLDBA 2012-02-22 16:41:14

+0

爲了闡明,對於col_b索引,僅在col_b上創建索引,而不是(col_b,col_a)。主鍵已經是索引的一部分,其中包括col_a,並將作爲「覆蓋索引」。 – 2012-02-22 16:52:07