2010-05-24 97 views
5

我在MySQL的表中有10mln行,在這個表上有7個索引。現在,當我嘗試添加8時,需要無限的時間才能完成此操作。有沒有什麼辦法可以解決這個問題,以便輕鬆快速地添加第8個索引?如何快速創建索引?

+0

它不應該是無限的。請提供您的表格架構和索引的詳細信息。 – 2010-05-24 21:12:56

+0

如果確實需要「永久」,請檢查您的磁盤空間是否用完 - 創建索引可能需要大量的臨時空間。 – nos 2010-05-24 21:27:39

+0

這是每個下一個索引需要更多時間的MySQL的有點bug。我有400 MB的真實和1,6 MB的交換內存,創建索引時根本沒有使用,而且我有20 GB的空間 – 2010-05-24 21:39:03

回答

2

這是MySQL剛剛吸引的千種方法之一。按照設計...

詳情:http://lists.mysql.com/mysql/202489

,如果我失去了人緣這個答案,我不關心。

+0

是的,這是我想說的 – 2010-05-24 21:40:57

+0

當我看到執行ALTER TABLE來更改列的默認值(或可爲空)時,我感到震驚是通過複製整個表並重新創建所有索引來執行的。這些事情在其他DMBS上花費的時間很少;推薦在MySQL上爲大表執行的方式是使用文件系統 - 用空數據文件更改表定義並將完整的數據文件放回原位。 – 2010-05-24 21:49:35

+1

本文的發佈者完全錯誤。在很多情況下,當您執行ALTER TABLE時,MySQL會重建表,但它絕不會在每個ALTER語句中多次重建表;此外,如果需要,您可以使用單個ALTER進行任意數量的修改。 – MarkR 2010-05-24 22:24:13

5

不,創建索引所需的時間與您擁有的數據量成正比。在MS SQL中,我在大約10分鐘的時間內在一個包含很多記錄的表上創建索引。

編輯:看到評論後,請詳細說明無限。根據定義,你說它永遠不會結束,我的答案與長期運行的索引創建有關,而不是無限的。

+0

是的,花了15分鐘 – 2010-05-24 21:40:41

+0

然後你是一樣好隨着它的到來。索引是一項非常密集的任務,特別是有很多記錄。 – 2010-05-24 21:54:08

0

您正在使用哪種引擎? ALTER TABLE ... CREATE INDEX的實現變化很大。

使用MyISAM,任何索引更改都需要完整的表重建。這不是固有的引擎,而是一個從未被修復的錯誤。

使用InnoDB,創建二級索引不需要重建表,但只有在使用InnoDB插件(而不是舊的,已發貨的引擎)時才能使用此優化。更改主鍵總是需要重建,因爲它是聚集的。

重建表格(無論是哪種情況)都需要很多工作,因爲它必須重建所有現有索引以及重寫行以完成操作。如果你的桌子適合RAM(10M行聽起來應該很容易),這是相當快的。

重建一個不適合ram的桌子相當昂貴,我建議儘可能避免它。

重建不適合ram的個別索引非常昂貴,最好避免。

您需要多長時間添加新的索引?也許你可以使用已經創建的索引填充表格?