Mysql
MySQL:在表之間執行大數據遷移
我想在 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_b
是id
,執行如下載入: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。而不是重新發明輪子,這裡是我過去關於如何以及為什麼這樣做的文章:
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Mar 16, 2012
:在 Debian 上使用多個核心進行單個 MySQL 查詢Apr 26, 2012
: CPU 性能與數據庫伺服器有關嗎?試一試 !!!
我可以建議其他的東西,比如緩衝區、日誌文件等等。我只解決了這兩個問題。
在這種情況下,通常最好的解決方案是使用如下
--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 倍。
希望這可以幫助