web-dev-qa-db-ja.com

MYSQLで一括インポートを行う最速の方法

MySQLで1つのテーブルから別のテーブルに多数のレコード(約1000万)をコピーする最速の方法について質問があります。

ターゲットテーブルには、1つの主キー、4つのインデックス、および3つの外部キー制約があります。ソーステーブルには同じ主キー、3つの等しいインデックスがあり、外部キーはありません。コピーする前にターゲットテーブルを切り捨てることができるので、重複キーチェックを行う必要はありません(結局、ソーステーブルの主キーは同じです)。

私のローカル開発マシンでは、挿入キー、無視キー、挿入キーを更新して、重複キーの更新、置換を試みました。これまでの最速の結果は約75分でした(replace intoとinsert ignore intoの同じ結果)。これを行うより速い方法はありますか?

3
Athlete

(本日、ここで詳細な回答を投稿できるようです...これが役に立ったかどうかをお知らせください)ここにテスト出力があります...

mysql> truncate table t1;
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t1 select * from t;
Query OK, 3842688 rows affected (36.19 sec)
Records: 3842688  Duplicates: 0  Warnings: 0

mysql>
mysql> \! rm /tmp/t.txt
mysql> select *  from t into outfile '/tmp/t.txt';
Query OK, 3842688 rows affected (7.24 sec)

mysql> load data infile '/tmp/t.txt' into table t1;
Query OK, 3842688 rows affected (25.20 sec)
Records: 3842688  Deleted: 0  Skipped: 0  Warnings: 0

レコードとデータサイズが大きいと、差のマージンが増える場合があります。

それらがMyISAMテーブルである場合は、 documentation の以下のメモを確認することをお勧めします。

ロード操作中に外部キー制約を無視するには、LOAD DATAを実行する前にSET foreign_key_checks = 0ステートメントを発行します。

空のMyISAMテーブルでLOAD DATA INFILEを使用すると、一意でないすべてのインデックスが(REPAIR TABLEと同様に)別のバッチで作成されます。通常、これにより、多くのインデックスがある場合にLOAD DATA INFILEがはるかに高速になります。極端な場合には、ファイルをテーブルにロードする前にALTER TABLE ... DISABLE KEYSでインデックスをオフにし、ファイルのロード後にALTER TABLE ... ENABLE KEYSを使用してインデックスを再作成することで、インデックスをさらに高速に作成できます。 。

また、メモリテーブルへの読み込み/メモリテーブルからの読み込みははるかに高速ですが、あなたが言ったサイズに基づいて、十分なメモリがあると思います(そのため、テーブルフルエラーと問題が表示される可能性があります...)!

とにかく、次のコマンドを試して速度の結果を共有してください:

select * from t into outfile '/tmp/t.txt';

load data infile '/tmp/t.txt' into table t1;

(私は<60分ですが魔法はないと思います...)

3
mysql_user

毎日、オンデマンドで何百万ものレコードのレコードセットをインポートする必要があるデータベースがあります。これまでに見つかった最速の方法は、LOAD DATA INFILEメソッドです。これは、主キーと複数列の一意キーを含む複数のインデックスを持つテーブルになります。適切なORDER BY句を使用してソーステーブルからデータをSELECTする場合、抽出に少し時間を追加しますが、LOADの直前にインデックスを削除し、LOADを実行してから、インデックスを再度追加できます。ソースデータは既に順序付けされているため、インデックスの作成時間が大幅に短縮され、LOAD中に挿入されたすべてのレコードのインデックススキャンの時間を節約できます。全体の読み込み時間は短縮されますが、そこに座って、インデックスが作成されるときに「何も」発生しないようにするのは困惑します。 1秒あたり100件以上のレコードから2000秒以上のレコードまで私たちを取り込んだ。

2
saherr1969

Mydumperまたはmyloaderの使用を検討しましたか?実行したテストでは、処理時間に大きな影響があるようです。詳細については、こちら( https://www.percona.com/ )を参照してください。

それとも、インポートしようとしている巨大なCSVタイプのファイルですか?

1
johmann