我們有一系列有機地增長到數百萬行的表,在生產中插入或更新可能需要兩秒鐘。但是,如果我轉儲表並從轉儲重新創建查詢閃電般快速。爲什麼MySQL InnoDB在大型表上插入/更新會在有幾個索引時變得非常慢?
我們重建了其中一個表,方法是創建一個副本,重建索引,然後執行重命名切換並複製任何新行,因爲該表只會附加到該表上。這樣做使插入和更新迅速閃電。
我的問題:
爲什麼插入會隨着時間變慢? 爲什麼重新創建表並執行導入修復此問題? 有沒有什麼辦法可以重建索引而不鎖定更新的表?
我們有一系列有機地增長到數百萬行的表,在生產中插入或更新可能需要兩秒鐘。但是,如果我轉儲表並從轉儲重新創建查詢閃電般快速。爲什麼MySQL InnoDB在大型表上插入/更新會在有幾個索引時變得非常慢?
我們重建了其中一個表,方法是創建一個副本,重建索引,然後執行重命名切換並複製任何新行,因爲該表只會附加到該表上。這樣做使插入和更新迅速閃電。
我的問題:
爲什麼插入會隨着時間變慢? 爲什麼重新創建表並執行導入修復此問題? 有沒有什麼辦法可以重建索引而不鎖定更新的表?
這聽起來像它要麼
你可以嘗試analyze table foo
不採取鎖,只是幾次索引潛水,需要幾秒鐘。
如果仍不能解決問題,則可以使用
mysql> SET PROFILING=1;
mysql> INSERT INTO foo ($testdata);
mysql> show profile for QUERY 1;
,你應該看到的大部分時間都花在。
顯然innodb在插入按PK順序完成時表現更好,這是你的情況嗎?
更新表格需要重建索引。如果您正在進行批量插入,請嘗試在一個事務中執行它們(如轉儲和還原一樣)。如果表格是寫有偏見的,我會考慮放棄索引,或者讓後臺作業讀取表格處理(例如,將其複製到索引表中)。
我不認爲你讀了這個問題,插入/更新非常快,當索引已經重建,即。通過優化表格,當表格增長有機時,它們只會變慢。我想知道這是爲什麼。 – Greg 2010-02-09 22:09:35
出於某種原因,我偏向於你進行批量更新,即有時添加更多行,有時會增加更少的突發。我認爲一旦你放棄指數,它就會很快。 – hurikhan77 2010-02-09 23:16:19
我還沒有嘗試刪除索引,我不能在生產中這樣做,只要我在測試機器上導入轉儲的速度很快。我認爲放棄指數會讓它變快。我可以嘗試將數據文件複製到測試機器來測試。 – Greg 2010-02-09 23:32:20
難道是由於XFS的碎片?
複製/從http://stevesubuntutweaks.blogspot.com/2010/07/should-you-use-xfs-file-system.html粘貼:
要檢查驅動器的碎片級別,例如位於的/ dev/SDA6:
須藤xfs_db -c斷枝-r的/ dev/SDA6
結果看起來就像這樣:
實際51270,理想的174,斷裂因子99.66%
這是我第一次安裝這些實用程序的實際結果,以前沒有XFS維護知識。很討厭。基本上,分區上的174個文件分散在51270個獨立的部分。要整理,運行以下命令:
須藤xfs_fsr -v的/ dev/SDA6
讓它運行一段時間。 -v選項讓它顯示進度。它完成後,請再次檢查碎片級別:
須藤xfs_db -c斷枝-r的/ dev/SDA6
實際176,理想174,斷裂因子1.14%
好多了!
InnoDB性能嚴重依賴於RAM。如果索引不適合內存,性能可能大幅下降。重建整個表可以提高性能,因爲數據和索引現在已經過優化。
如果您只是插入表中,MyISAM更適合這種情況。由於記錄被添加到文件的末尾,因此如果僅追加,則不會出現鎖定問題。 MyISAM還允許您使用MERGE表格,這些表格非常適合將部分數據脫機或存檔,而無需執行導出和/或刪除操作。
追蹤正在使用my.ini並增加key_buffer_size
我有一個1.5GB的表格,其中每秒查詢次數(全部寫入)下降到17個大關鍵字。我發現奇怪的是在管理面板(當表被鎖定寫入以加速進程時),它每秒執行200次InnoDB讀取,每秒寫入24次。
它被迫從磁盤讀取索引表。我將key_buffer_size從8M改爲128M,性能跳躍到每秒完成150次查詢,只需執行61次讀取即可獲得240次寫入。 (重啓後)
對於innoDB,innodb_buffer_pool_size直接影響存儲在內存中的行/索引的數量,這減少了寫入之前的衝突查找。 – ppostma1 2014-02-28 22:15:19
key_buffer_size對innodb沒有影響,它是myisam設置。 – 2016-02-03 22:05:38
存儲引擎?文件系統? MySQL版本?記錄非常大嗎? – ggiroux 2010-02-08 16:28:17
對不起,應該包括這個問題! InnoDB,XFS上有一個15k磁盤的RAID陣列。 – Greg 2010-02-08 17:12:32