2013-08-04 80 views
2

我正在使用一個表格,其中有很多索引,實際上有8個索引。但他們中的一些似乎是多餘的,例如,這裏是其中的一些指標:現在數據庫和多列索引(mySQL)

type  columns 
----- ------------------------------ 
index project_id 
unique project_id, user_id, event_id 
index project_id, user_id, type, subtype 

,據我所知,唯一的一個是必要的,因爲它的預防這三個鍵的組合的重複,我們需要那。但是,不是不必要的第一個索引?

我做了一個快速的select * from activities where project_id = 5579,它使用4列索引(基於Explain)。用另一個查詢,只需更改project_id,它就使用唯一索引。會不會有第一個索引仍在使用的情況,還是我可以安全地刪除它?

這種情況也適用於user_id列 - 它自己編制索引,然後在其第一列有多列索引。

我的理解是更多索引=更慢的插入,所以我想我應該嘗試刪除不必要的。

+0

那麼表是否受到慢插入的困擾?它破壞了什麼嗎?這裏的問題在於,這些索引可能是針對運行緩慢的查詢創建的,通過刪除它們,您將創建另一個問題。請記住,如果它沒有破解不修復它。 – Namphibian

+0

@Nafphibian該表每秒可獲得大約30個插入,所以使其更好會是一件好事。我相信,由於第二和第三索引,刪除第一個索引不會影響任何依賴於它的查詢,但是我正在尋找可能比我更熟悉的人的驗證。 – Will

+0

你的想法是正確的。我們能否看到所有的指標?它可能超過了索引。你能識別出針對這個表發出的所有查詢嗎? – Namphibian

回答

0

索引project_id, user_id, type, subtype涵蓋了WHERE或GROUP BY本身僅指定project _id的情況。

0

關於複合索引需要注意的關鍵之一是索引中列出的字段的順序很重要。

因此,對於你的索引project_id, user_id, event_id你只能用這個指標如果滿足下列條件之一滿足:

project_id在WHERE,GROUP BY,ORDER BY或JOIN條件 或 project_iduser_id是使用在WHERE,GROUP BY,ORDER BY或JOIN條件 或 project_iduser_id AS event_id在WHERE,GROUP BY,ORDER BY或JOIN條件

如果你厭倦了使用user_id用於使用或event_id自己,索引將不會被使用。如果您嘗試使用user_idevent_id,則不會使用索引。如果您嘗試使用project_idevent_id,則不會使用索引。

所以要回答你的問題,index_id索引可能不需要在這裏是你要使用index_id本身`。

您當然必須全面瞭解表格可能被查詢的所有可能方式,以便了解需要哪些索引以及哪些索引不需要。