[MySQL][追記]運用中のDBにバックアップしたデータを流し込んだ

(状況はこちらにかいてあるので省略)

で、まぁどうしてくれようかと思っていたんですが、方法を変えたらあっという間に決着がついたので追記。バックアップデータをsrctbl,入れる先をtargettblとしています。

1. srctblをCSVエンジンからMyISAMへ

ALTER TABLE srctbl ADD PRIMARY KEY(firstprimkey, … ) ENGINE MyISAM;

2.JDBCでPRIMARYKEY(複数カラム)の最初の物を列挙してArrayListに取得

SELECT * FROM srctbl GROUP BY firstprimkey

3.そのキーでWHERE句指定してINSERTを一個ずつ送り込んであげたらすぐに終わりました。

INSERT INTO targettbl (SELECT * FROM srctbl WHERE firstprimkey = ?)

恐らくmysqlクライアントにコマンド流し込む場合をそのまま続けているとかなり時間がかかっていた(一週間)ので、方法を変えたのはよかった。ALTER TABLEですが、予想外に高速でした。おおよそ3千万レコード入っていましたがすぐ(10分以内程度)に終わりました。インデックスなどをつけていない生のDBだとかなり速いのかもしれませんね、遅いイメージが先行していて試していませんでした。

かかった時間としてはこんな感じ

CSVテーブルのまま前回のスクリプトでゆっくりインサート→一週間程度(推定。下手するともっと)

MyISAMにALTER TABLEしてPRIMARY KEY付加してからJDBCでWHERE句で区切ってインサート(恐らく絞った後は2000~15000程度のカラムが存在)→約2時間

速くできる方法を探すのって大事。毎回言ってる気がしますが。

カテゴリー: MySQL, サーバ関連, プログラミング関連 パーマリンク

[MySQL][追記]運用中のDBにバックアップしたデータを流し込んだ への1件のフィードバック

  1. ピンバック: [MySQL]運用中のDBにバックアップしたデータを流し込む(INSERT INTO SELECTの分割) | Gumu-Lab.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です