2010-07-18 89 views
2

如何在不影響生產性能的情況下將索引添加到18 GB innodb mysql表中?該表經常被訪問,我試着改變表格,並且已經鎖定了200多個查詢,這對性能不利。還有其他方法可以做到嗎?如何在不影響生產性能的情況下將索引添加到18 GB的innodb mysql表中?

+0

請參閱http://stackoverflow.com/questions/1601735/whats-the-easiest-way-to-add-an-index-on-a-live-myisam-table – 2010-07-18 07:08:46

+0

我可以就此做同樣的事嗎?數據庫?將原始數據庫複製到新數據庫,更改新數據庫,同步數據庫之間的內容,刪除原始數據庫,然後重命名新數據庫? – TheOnly92 2010-07-18 07:21:59

回答

3

TheOnly92 - 還有另外一個選擇,一個即使是亞馬遜和eBay使用。在網站無法訪問的情況下,維護時間過長並不構成「糟糕」的形式。在這些場合中,您將看到一個404維護頁面以用戶友好的界面顯示,表示該站點正在進行基本的升級......等等。

這可能是創建此應用程序時最實用的解決方案頁面會帶你5分鐘,而另一個選項可能需要很多小時才能找出並實現更多。另外,由於這種情況很少發生,所以用戶不太可能被這樣的信息或停機時間推遲。

吉姆

+0

您有更具體的方法嗎?我想我明白你的意思,但我有點混淆。由於我有很多代碼編輯/插入記錄到數據庫的部分,我不認爲我可以停止所有的1小時,因爲它是整個網站的主要部分... – TheOnly92 2010-07-18 09:09:28

+1

+1計劃停機時間是一個完全可以接受的解決方案用於維護目的,並且即使在這個24x7x365的世界中也應該保持這樣。只要預先給出了停機時間的適當警告,並提供了再次提供的估計時間,那麼系統的大多數用戶都會接受它。正如吉姆指出的那樣,互聯網上的大多數大型網站(ebay,amazon,twitter等)都是這樣做的。 – 2010-07-18 10:08:22

+0

只要你有相當準確的估計工作需要多長時間(你應該能夠在測試系統上運行你的任務來得到估計,並測試你想要做什麼) ,只要你計劃你打算做的一切事情,如果任何步驟失敗了,就有可能發生回滾。 – 2010-07-18 10:12:59

2

這取決於你不失去新紀錄有多重要?

重複使用CREATE TABLE ... LIKE ...表結構,增加新的索引到重複表,做一個INSERT INTO ... SELECT ... FROM ...抓住所有數據,然後運行一對ALTER s到重命名舊錶,然後將新表重命名爲舊錶名。

不幸的是,如果舊錶中的任何數據在INSERT/SELECT運行時間和表被重命名之間發生變化,那麼它可能會丟失。使用one of the Maatkit tools進行表格比較可能會得到數據。

另一種常見模式依賴於重複的硬件。設置複製從站,在那裏添加索引,然後使從站成爲主站。

這些都不會很快,但它們可能會比直接添加索引更快。但是,如果您可以承受停機時間,那麼在更改/複製/切換從屬設備時,您應該只是將系統關閉。不必擔心重新獲得數據同步將使您的生活更輕鬆。

(你不妨考慮切換到一個數據庫,lets you add indexes without locking the table

+0

那麼,我們不會丟失數據是非常關鍵的...... – TheOnly92 2010-07-18 07:15:04

3

另一種選擇是使用pt-online-schema-change。它將使用新索引創建舊錶的副本並創建觸發器,以反映從舊錶到新表的所有更改。最後,它將更改舊錶的名稱。

相關問題