2010-02-08 71 views
17

我們有一系列有機地增長到數百萬行的表,在生產中插入或更新可能需要兩秒鐘。但是,如果我轉儲表並從轉儲重新創建查詢閃電般快速。爲什麼MySQL InnoDB在大型表上插入/更新會在有幾個索引時變得非常慢?

我們重建了其中一個表,方法是創建一個副本,重建索引,然後執行重命名切換並複製任何新行,因爲該表只會附加到該表上。這樣做使插入和更新迅速閃電。

我的問題:

爲什麼插入會隨着時間變慢? 爲什麼重新創建表並執行導入修復此問題? 有沒有什麼辦法可以重建索引而不鎖定更新的表?

+1

存儲引擎?文件系統? MySQL版本?記錄非常大嗎? – ggiroux 2010-02-08 16:28:17

+0

對不起,應該包括這個問題! InnoDB,XFS上有一個15k磁盤的RAID陣列。 – Greg 2010-02-08 17:12:32

回答

8

這聽起來像它要麼

  • 指數不平衡隨着時間的推移
  • 磁盤碎片
  • 內部InnoDB的數據文件(一個或多個)碎片

你可以嘗試analyze table foo不採取鎖,只是幾次索引潛水,需要幾秒鐘。

如果仍不能解決問題,則可以使用

mysql> SET PROFILING=1; 
mysql> INSERT INTO foo ($testdata); 
mysql> show profile for QUERY 1; 

,你應該看到的大部分時間都花在。

顯然innodb在插入按PK順序完成時表現更好,這是你的情況嗎?

+0

你有沒有關於索引不平衡的信息的鏈接?此外,我認爲你可能會將磁盤碎片化,然後我將研究這個問題。 – Greg 2010-02-10 11:09:41

+0

我記得被這個http://bugs.mysql.com/bug.php?id=43660所擊中,這更多的是「64位平臺上錯誤的索引統計」,但這可能會導致相同種類的的問題。 – ggiroux 2010-02-10 16:46:03

1

更新表格需要重建索引。如果您正在進行批量插入,請嘗試在一個事務中執行它們(如轉儲和還原一樣)。如果表格是寫有偏見的,我會考慮放棄索引,或者讓後臺作業讀取表格處理(例如,將其複製到索引表中)。

+1

我不認爲你讀了這個問題,插入/更新非常快,當索引已經重建,即。通過優化表格,當表格增長有機時,它們只會變慢。我想知道這是爲什麼。 – Greg 2010-02-09 22:09:35

+0

出於某種原因,我偏向於你進行批量更新,即有時添加更多行,有時會增加更少的突發。我認爲一旦你放棄指數,它就會很快。 – hurikhan77 2010-02-09 23:16:19

+0

我還沒有嘗試刪除索引,我不能在生產中這樣做,只要我在測試機器上導入轉儲的速度很快。我認爲放棄指數會讓它變快。我可以嘗試將數據文件複製到測試機器來測試。 – Greg 2010-02-09 23:32:20

0

難道是由於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%

好多了!

7

InnoDB性能嚴重依賴於RAM。如果索引不適合內存,性能可能大幅下降。重建整個表可以提高性能,因爲數據和索引現在已經過優化。

如果您只是插入表中,MyISAM更適合這種情況。由於記錄被添加到文件的末尾,因此如果僅追加,則不會出現鎖定問題。 MyISAM還允許您使用MERGE表格,這些表格非常適合將部分數據脫機或存檔,而無需執行導出和/或刪除操作。

+0

「嚴重依賴RAM」需要引用。 – Pacerier 2015-04-09 13:28:01

+0

關於InnoDB [使用內存]的詳細信息(http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html)。請注意,InnoDB在5.0到5.1,5.5及更高版本方面有很大的改進。 – 2015-04-10 14:27:54

+0

+1͏͏͏͏͏͏͏͏͏͏͏͏ – Pacerier 2015-04-11 15:37:48

0

追蹤正在使用my.ini並增加key_buffer_size我有一個1.5GB的表格,其中每秒查詢次數(全部寫入)下降到17個大關鍵字。我發現奇怪的是在管理面板(當表被鎖定寫入以加速進程時),它每秒執行200次InnoDB讀取,每秒寫入24次。

它被迫從磁盤讀取索引表。我將key_buffer_size從8M改爲128M,性能跳躍到每秒完成150次查詢,只需執行61次讀取即可獲得240次寫入。 (重啓後)

+1

對於innoDB,innodb_buffer_pool_size直接影響存儲在內存中的行/索引的數量,這減少了寫入之前的衝突查找。 – ppostma1 2014-02-28 22:15:19

+1

key_buffer_size對innodb沒有影響,它是myisam設置。 – 2016-02-03 22:05:38

相關問題