MySQLで1つのテーブルから別のテーブルに多数のレコード(約1000万)をコピーする最速の方法について質問があります。
ターゲットテーブルには、1つの主キー、4つのインデックス、および3つの外部キー制約があります。ソーステーブルには同じ主キー、3つの等しいインデックスがあり、外部キーはありません。コピーする前にターゲットテーブルを切り捨てることができるので、重複キーチェックを行う必要はありません(結局、ソーステーブルの主キーは同じです)。
私のローカル開発マシンでは、挿入キー、無視キー、挿入キーを更新して、重複キーの更新、置換を試みました。これまでの最速の結果は約75分でした(replace intoとinsert ignore intoの同じ結果)。これを行うより速い方法はありますか?
(本日、ここで詳細な回答を投稿できるようです...これが役に立ったかどうかをお知らせください)ここにテスト出力があります...
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分ですが魔法はないと思います...)
毎日、オンデマンドで何百万ものレコードのレコードセットをインポートする必要があるデータベースがあります。これまでに見つかった最速の方法は、LOAD DATA INFILEメソッドです。これは、主キーと複数列の一意キーを含む複数のインデックスを持つテーブルになります。適切なORDER BY句を使用してソーステーブルからデータをSELECTする場合、抽出に少し時間を追加しますが、LOADの直前にインデックスを削除し、LOADを実行してから、インデックスを再度追加できます。ソースデータは既に順序付けされているため、インデックスの作成時間が大幅に短縮され、LOAD中に挿入されたすべてのレコードのインデックススキャンの時間を節約できます。全体の読み込み時間は短縮されますが、そこに座って、インデックスが作成されるときに「何も」発生しないようにするのは困惑します。 1秒あたり100件以上のレコードから2000秒以上のレコードまで私たちを取り込んだ。
Mydumperまたはmyloaderの使用を検討しましたか?実行したテストでは、処理時間に大きな影響があるようです。詳細については、こちら( https://www.percona.com/ )を参照してください。
それとも、インポートしようとしている巨大なCSVタイプのファイルですか?