2013-04-18 19 views
4

讓我們考慮一下我有一個60列的表,我需要在該表上執行所有類型的查詢,並且需要將該表與其他表連接起來。我幾乎使用所有行來搜索該表中的數據,包括其他表。該表就像數據庫中的主表(如主鍵)。所以所有的桌子都與這張桌子相關。 通過考慮上述情況,我可以在表格(60列) 上的每一列上創建索引,這是不是很好的做法?如果我將索引放在表中的每一列上,會發生什麼

在單句:

Is it best practice to create index on each column in a table ? 
What might happens if I create index on each column in a table? 

當指數可能是「主鍵」,「唯一鍵」或「指數」

請發表評論,如果這個問題不清楚你我會盡力改善這個問題。

+3

如果您在每一列上都有一個索引,則成本是額外的存儲空間和插入和更新的一小部分開銷。 – Scotch 2013-04-18 05:49:41

+0

爲什麼在插入和更新操作時出現開銷 – 2013-04-18 05:52:42

+3

當使用60個索引列向表中插入新記錄時,還必須爲這60列創建索引條目。 (將索引視爲小表,儘管它們通常是樹)。 – Scotch 2013-04-18 05:53:57

回答

6

MySQL's documentation是對這個很清楚的(在列彙總使用指標,你會在WHEREJOIN和聚合功能使用)。

因此,在表中的所有列上創建索引時,即使它是60列,也沒有本質上的錯誤。更多的索引有更慢的插入和一些更新,因爲MySQL必須創建密鑰,但是如果您不創建索引,則MySQL必須掃描整個表,如果只有非索引列用於比較和聯接。

我不得不說,我很驚訝,你會

  1. 有60列的表
  2. 有使用,也可以在一個JOINWHERE條款所有這些列的不依賴任何同一表中的其他列

...但這是一個單獨的問題。

+0

我很高興你的回答, 很好肯定我可以說我正在使用超過一半的列加入或在哪裏 – 2013-04-18 05:59:47

+0

ty爲好答案 – Andrew 2017-07-12 15:37:57

2

添加一個索引意味着數據庫必須保持它,這意味着它必須更新,所以寫入越多,索引就會更新。

創建索引開箱即用的是不是一個好主意,創建只有當你需要它的索引(或當你可以看到在未來的需要......只有當它是很明顯的)

2

它不是在表中的每個列上創建索引的最佳實踐。

當列在where子句中使用時,索引通常用於提高查詢性能。

假設你使用此查詢了很多:

select * from tablewith60cols where col10 = 'xx'; 

那麼這將是有用的對col10的索引。

請注意,默認情況下,主鍵具有索引,因此當您將表與其他表連接時,應該使用主鍵進行連接。

相關問題