Mysql

MySQL:在表之間執行大數據遷移

  • July 18, 2019

我想在 2 個 InnoDB 表之間遷移數據。

目前我正在執行這個查詢:

INSERT INTO table_a SELECT * FROM table_b;

如果數據集增長,避免 CPU 過載的最佳方法是什麼?

謝謝

由於您使用的是 InnoDB,因此我想提出以下建議:

建議 #1

如果您執行 INSERT、UPDATE 和 DELETE,請像這樣批量載入表:

CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT * FROM table_b;
ALTER TABLE table_a RENAME table_old;
ALTER TABLE table_new RENAME table_a;
DROP TABLE table_old;

如果您只執行 INSERT 和 SELECT,則將新條目載入到表中。table_a假設和的主鍵table_bid,執行如下載入:

CREATE TABLE table_new LIKE table_a;
INSERT INTO table_new SELECT B.* FROM table_b B
LEFT JOIN table_a A USING (id) WHERE A.id IS NULL;
INSERT INTO table_a SELECT * FROM table_new;
DROP TABLE table_new;

建議 #2:為多個 CPU 調整 InnoDB

確保您使用的是 MySQL 5.5。如果您有 MySQL 5.1.38 或更高版本,則必須安裝 InnoDB Plugin。如果您有 MySQl 5.1.37 或更早版本,只需升級到 MySQL。

一旦你這樣做了(或者如果你已經有了 MySQL 5.5),你必須為多個 CPU 調整 InnoDB。而不是重新發明輪子,這裡是我過去關於如何以及為什麼這樣做的文章:

試一試 !!!

我可以建議其他的東西,比如緩衝區、日誌文件等等。我只解決了這兩個問題。

在這種情況下,通常最好的解決方案是使用如下--tab選項的 mysqldump:

mysqldum --tab=/path/to/serverlocaldir --single-transaction <database> table_a

tab 選項產生 2 個文件,一個文件 -table_a.sql- 僅包含表創建語句,另一個文件 -table_a.txt- 包含製表符分隔的數據。

現在您可以創建新表

create table table_b like table_a;

然後,您只需在新表中載入數據,LOAD DATA而無需關心表的名稱。

LOAD DATA INFILE '/path/to/serverlocaldir/table_a.txt' 
 INTO TABLE table_b FIELDS TERMINATED BY '\t' ...

LOAD DATA 通常比使用 INSERT 語句快 20 倍。

希望這可以幫助

引用自:https://dba.stackexchange.com/questions/24116