簡體   English   中英

當有少量索引時,為什么MySQL InnoDB在大型表上插入/更新會變得非常慢?

[英]Why do MySQL InnoDB inserts / updates on large tables get very slow when there are a few indexes?

我們有一系列有機增長到數百萬行的表,在生產中進行插入或更新可能需要長達兩秒鍾。 但是,如果我轉儲表並從轉儲查詢重新創建它是快速的。

我們通過創建一個副本來重建其中一個表,重建索引然后執行重命名切換並復制任何新行,這是因為該表只被附加到。 這樣做可以快速插入和更新閃存。

我的問題:

為什么插入會隨着時間的推移變慢? 為什么重新創建表並進行導入修復? 有沒有辦法可以重建索引而不鎖定表更新?

這聽起來像是

  • 索引不平衡隨着時間的推移
  • 磁盤碎片
  • 內部innodb數據文件碎片

您可以嘗試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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM