2013-03-13 80 views
0

我有一個MySQL數據表,裏面有大約5億行的數據。我們需要通過讀取這些數據來運行計算,並且計算出的數據(這是原始數據的標準化形式)需要寫入另一個InnoDB表中。InnoDB Table Bulk Insert

我們現在的設置是一個虛擬雲,其中包含一臺機器以及數據庫,因此機器數據庫連接非常快。

發生在數據上(以及讀取數據)的計算速度非常快,整個過程的瓶頸是將標準化數據插入InnoDB表(標準化數據包含一些標記,儘管不長,這會降低插入速度)。

不幸的是,我們無法修改某些系統變量,例如innodb_log_file_size(我們正在使用Amazon AWS),這有助於提高插入性能。

將所有這些數據推送到MySQL上最好的辦法是什麼?由於計算過程非常簡單,我幾乎可以編寫一個Python腳本來獲取標準化數據並以任何格式輸出。在計算過程中即時插入這些數據的過程非常緩慢,而且隨着時間的推移會變慢。

我想問題是,那麼將大量數據插入InnoDB表的最佳過程是什麼(就輸入格式和實際導入而言)?

回答

0

我的第一反應是問你調節緩衝變量...但你說你不能改變太多,服務器配置參數,這裏是另一種選擇......

做計算並將輸出轉儲到csv中。你可以使用'SELECT ... INTO OUTFILE'命令。 然後,您將連接到目標InnoDB,並執行'set autocommit = 0',然後'load data local infile'將該CSV加載回目標表。最後把自動提交回1.

我可以建議的許多其他選項(如正確的分區模式,主鍵順序插入等),但我需要知道你的數據庫的結構,傳入數據集和索引。

0

在這種情況下,你沒有做基表上任何東西 - 最有可能更新只計劃時間間隔的基礎上二次InnoDB表中的數據,我會perfer以下步驟

  1. 乘坐mysqldump - where(--where「id> 91919」或 - 「update_time> now() - interval 1 hour」)選項。如果表中可能避免鎖定太
  2. 將數據還原到一個臨時數據庫表
  3. 做你的計算上臨時DB和更新輔助表
  4. 降創建臨時DB /表。
+0

感謝您的評論。不過,我對你指的是什麼感到困惑。我的表格(包含數據的原始表格和包含標準數據的目標表格)都在同一個MySQL實例上。我需要找到將我計算的值插入到標準表中的最快方法。請讓我知道如果還有什麼不清楚! – user1094786 2013-03-13 19:41:52

+0

作爲您的第一張桌子,我只是將相關數據提取到一張小桌子上,計算新的字段並更新第二張桌子。我更喜歡** mysqldump ** over **創建臨時表select * from表where <> **,因爲它也會阻止鎖。 – georgecj11 2013-03-13 19:56:13

0

是你的時間系列數據?上週有類似的問題。加載的分區,它變得更快。我也從http://www.ajaydivakaran.com/2013/03/12/mysql-innodb-when-inserts-start-slowing-down/優化了我的設置但是,如果你不能優化,那麼使用分區來加快插入速度。

+0

嗨,歡迎來到Stack Overflow!一個可能的解決方案的鏈接總是受歡迎的,但請在鏈接上添加上下文,以便您的同行用戶可以瞭解它是什麼以及它爲什麼在那裏。始終引用重要鏈接中最相關的部分。想象一下,頁面被移動到另一臺服務器,或直接鏈接改變 - 未來的用戶將無法從答案中獲益。看看[如何回答](http://stackoverflow.com/questions/how-to-answer)。 – Jesse 2013-03-20 01:55:11