2010-11-05 53 views
0

我有一個場景,我需要做相對大量的插入。 假設我每分鐘有一百萬行...被插入到結構相同的表中,但是對數據應用了不同級別的聚合。Mysql InnoDB合併/複製數據

此外,爲了再次訪問這些數據,它的索引很大。

現在,爲了儘快完成插入操作,騰出時間進行其他處理,我想插入到具有完全相同結構但沒有索引的「DUMP」表中,然後運行將數據ETL到索引聚集表中的「合併過程」...爭辯說,因爲它發生在數據庫內部,它應該比從外部多次推入更快。

但是,一個簡單的「insert into tableB select * from tableA」很容易就超過了我的innodb_buffer_pool和行鎖,然後錯誤1026我。

因此,最後要回答的問題是:是否有快速/可靠的方式將大量數據從一個表移動到另一個表?
表格可以也可能會被分區。我猜想你可以簡單地將一個分區從一個表移動到另一個表。
如果「從插入選擇」是,那麼我想它會更安全,更容易插入所有從應用程序端。

回答

1

您當然可以插入到中間表中,然後傳輸行。儘管如此,這可能最終會爲數據庫帶來更多的工作。

INSERT ... SELECT當然是你的朋友,如果你想將數據從一張表複製到另一張表中,肯定會比通過客戶端移動它更快。

每分鐘1M行是相當多的插入,你一定要仔細構建你的應用程序。我認爲你已經在大批量生產這些產品了(10,000行似乎總體上是正確的),但是你也想要注意innodb的耐久性水平(即沖洗時)。

關閉MySQL的binlog會減少很多fsyncs的數量(即在某些情況下爲50%),因此建議用於非常高提交的工作負載。您可能還想看看第三方完成的各種調整工作。當然,使用插件不是原始的innodb。


要「釋放其他處理時間」,您的意思是在您的客戶端或您的數據庫?如果它是你的客戶,那麼你一定要與其他工作異步插入 - 將記錄保存在內存或光盤上(但要注意這家商店的耐用性),直到你有時間插入它們,並將它們大批插入。