[英]Why do MySQL InnoDB inserts / updates on large tables get very slow when there are a few indexes?
我們有一系列有機增長到數百萬行的表,在生產中進行插入或更新可能需要長達兩秒鍾。 但是,如果我轉儲表並從轉儲查詢重新創建它是快速的。
我們通過創建一個副本來重建其中一個表,重建索引然后執行重命名切換並復制任何新行,這是因為該表只被附加到。 這樣做可以快速插入和更新閃存。
我的問題:
為什么插入會隨着時間的推移變慢? 為什么重新創建表並進行導入修復? 有沒有辦法可以重建索引而不鎖定表更新?
這聽起來像是
您可以嘗試analyze table foo
不帶鎖的analyze table foo
,只需幾次索引潛水並花費幾秒鍾。
如果這不能解決問題,您可以使用
mysql> SET PROFILING=1;
mysql> INSERT INTO foo ($testdata);
mysql> show profile for QUERY 1;
你應該看到大部分時間花在哪里。
顯然,當以PK命令完成插入時,innodb表現更好,這是你的情況嗎?
InnoDB性能嚴重依賴於RAM。 如果索引不適合RAM,性能可能會大幅下降。 重建整個表可以提高性能,因為數據和索引現在已經過優化。
如果您只是插入表中,MyISAM更適合這種情況。 如果僅追加,則不會出現鎖定問題,因為記錄已添加到文件末尾。 MyISAM還允許您使用MERGE表,這些表非常適合脫機或歸檔部分數據而無需進行導出和/或刪除。
跟蹤使用中的my.ini並增加key_buffer_size
我有一個1.5GB的表,其中一個大鍵,其中每秒查詢數(所有寫入數)都降到了17.我發現在管理面板中很奇怪(在表中因為寫入而被鎖定以加快進程)它每秒執行200次InnoDB讀取,每秒24次寫入。
它被迫從磁盤上讀取索引表。 我將key_buffer_size從8M更改為128M,性能躍升至每秒150次查詢完成,只需執行61次讀取即可獲得240次寫入。 (重啟后)
更新表需要重建索引。 如果您正在進行批量插入,請嘗試在一個事務中執行它們(如轉儲和還原那樣)。 如果表是寫偏的,我會考慮放棄索引或者讓后台作業對表進行讀處理(例如通過將其復制到索引表)。
可能是由於XFS碎片造成的?
復制/粘貼自http://stevesubuntutweaks.blogspot.com/2010/07/should-you-use-xfs-file-system.html :
要檢查驅動器的碎片級別,例如位於/ dev / sda6:
sudo xfs_db -c frag -r / dev / sda6
結果將如下所示:
實際51270,理想174,碎片因子99.66%
這是我第一次安裝這些實用程序時得到的實際結果,以前不知道XFS維護。 非常討厭。 基本上,分區上的174個文件分布在51270個單獨的部分上。 要進行碎片整理,請運行以下命令:
sudo xfs_fsr -v / dev / sda6
讓它運行一段時間。 -v選項讓它顯示進度。 完成后,嘗試再次檢查碎片級別:
sudo xfs_db -c frag -r / dev / sda6
實際176,理想174,碎片因子1.14%
好多了!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.