簡體   English   中英

InnoDB表批量插入

[英]InnoDB Table Bulk Insert

我有一個MySQL數據表,其中包含約五億行。 我們需要通過讀取該數據來進行計算,然后將計算出的數據(原始數據的標准化形式)寫入另一個InnoDB表中。

我們當前擁有的設置是一個虛擬雲,其中包含一台計算機以及數據庫,因此計算機與數據庫的連接非常快。

數據上的計算(以及讀取)的速度非常快,整個過程的瓶頸是將標准化數據插入InnoDB表中(標准化數據包含一些索引,盡管時間不長)。減慢插入速度)。

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

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

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

在這種情況下,由於您沒有在基表上執行任何操作-並且最有可能僅按計划的時間間隔更新輔助innodb表中的數據,因此請執行以下步驟

  1. 采取與--where一個mysqldump的(--where “ID> 91919”或--where “UPDATE_TIME>現在() -間隔1小時”)的選項。 如果可能的話,也避免鎖住桌子
  2. 將數據還原到臨時數據庫表
  3. 在臨時數據庫上進行計算並更新輔助表
  4. 刪除創建的臨時數據庫/表。

我的第一個直覺是要求您調整緩沖區變量..但是正如您所說的,您不能更改很多服務器配置參數,這是另一個選擇...

進行計算並將輸出轉儲到csv中。 為此,您可以使用“ SELECT ... INTO OUTFILE”命令。 然后,您將連接到目標InnoDB,並執行'set autocommit = 0',然后執行'load data local infile'將此CSV重新加載到目標表中。 最后將自動提交重新設置為1。

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

是您的時間序列數據嗎? 上周發生過類似的問題。 加載分區,它變得更快。 我還從http://www.ajaydivakaran.com/2013/03/12/mysql-innodb-when-inserts-start-slowing-down/優化了設置,但是如果無法優化,請使用分區進行更快的插入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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