大量のデータをインポートする MySQL の速度が遅い問題を解決する

1. データのエクスポート方法を選択する

        まず最初に提案したいのは、MySQL に付属のコマンド ライン ツールを使用してデータをエクスポートおよびインポートし、Navicat やワークベンチなどのグラフィカル ツールを使用しないことです。特に大量のデータがある場合、MySQL に付属のコマンド ライン ツールを使用してエクスポートとインポートを行うと、Navicat などのグラフィカル ツールを使用するよりも数倍速く、Navicat などのグラフィカル ツールを使用してエクスポートおよびインポートする際に行き詰まりやすくなります。大量のデータを扱う操作を実行します。次に、MySQL に付属のコマンド ライン ツールを使用してインポートおよびエクスポートする方法を簡単に紹介します。

# 导出整个实例
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql

# 导出指定库
mysqldump -uroot -pxxxxxx --databases testdb > testdb.sql

# 导出指定表
mysqldump -uroot -pxxxxxx testdb test_tb > test_tb.sql

# 导入指定SQL文件 (指定导入testdb库中)
mysql -uroot -pxxxxxx testdb < testdb.sql

        インポートされた SQL スクリプトの内容のほとんどは、最初にデータベースとテーブルを構築してからデータを挿入することですが、最も時間がかかるのは、データを挿入するための挿入です。ファイル サイズを小さくするには、次のように拡張挿入メソッドを使用することをお勧めします。つまり、次のように、複数の行をまとめてバッチで挿入します。 ,(); . 拡張子を使用して挿入すると、1 つずつ挿入するよりもはるかに小さくなり、ファイル サイズがはるかに小さくなり、挿入速度が数倍速くなります。

        デフォルトでは、mysqldump によってエクスポートされたファイルはバッチ挿入の方法を使用します. エクスポートするときは、 --skip-extended-insert パラメータを使用して 1 つずつ挿入できます.

2.パラメーターを変更してインポートを高速化してみてください

        MySQL には、既知の「ダブル 1」パラメーターのペア、つまりinnodb_flush_log_at_trx_commitsync_binlog があります。For security, the default value of these two parameters is 1. スクリプトをすばやくインポートするために、これら 2 つのパラメーターを一時的に変更できます. 以下に、これら 2 つのパラメーターを簡単に紹介します:

innodb_flush_log_at_trx_commit:

innodb_flush_log_at_trx_commit のデフォルト値は 1 で、0、1、2 に設定できます

innodb_flush_log_at_trx_commit が 0 に設定されている場合、ログ バッファーは 1 秒に 1 回ログ ファイルに書き込まれ、ログ ファイルの (ディスクへの) フラッシュ操作が同時に実行されます。このモードでは、トランザクションがコミットされると、ディスクへの書き込み操作はアクティブにトリガーされません。

innodb_flush_log_at_trx_commit が 1 に設定されている場合、MySQL はログ バッファ データをログ ファイルに書き込み、トランザクションがコミットされるたびに (ディスクに) フラッシュします。

innodb_flush_log_at_trx_commit が 2 に設定されている場合、MySQL はトランザクションがコミットされるたびにログ バッファ データをログ ファイルに書き込みますが、フラッシュ (ディスクへのフラッシュ) 操作は同時に実行されません。このモードでは、MySQL は毎秒 (ディスクへの) フラッシュ操作を実行します。

sync_binlog:

sync_binlog のデフォルト値は 1 で、[0,N) に設定できます。

sync_binlog = 0 の場合、MySQL はディスクに同期しませんが、オペレーティング システムが他のファイルを更新するメカニズムと同様に、オペレーティング システムに依存してバイナリ ログを更新します。

sync_binlog =N (N>0) の場合、MySQL は fdatasync() 関数を使用して、書き込まれたバイナリ ログ バイナリ ログを N 回ごとにディスクに同期します。

これら 2 つのパラメータはオンラインで変更できます. これらをすばやくインポートするには、次の手順に従ってください:

# 1.进入MySQL命令行 临时修改这两个参数
set global innodb_flush_log_at_trx_commit = 2;
set global sync_binlog = 2000;

# 2.执行SQL脚本导入
mysql -uroot -pxxxxxx testdb < testdb.sql

# 3.导入完成 再把参数改回来
set global innodb_flush_log_at_trx_commit = 1;
set global sync_binlog = 1;

        

        もう 1 つのシナリオは、新しいスレーブ ライブラリを作成する必要がある場合、または binlog を生成する必要がない場合です. このとき、SQL スクリプトをインポートするときに一時的に binlog を記録しないように設定できます. set sql_log_bin=0 を最初に追加できますスクリプトのインポートを実行すると、さらに高速化されます。MySQL インスタンスで binlog が有効になっていない場合、このステートメントを実行する必要はありません。

要約:

この記事では主にデータをすばやくインポートする方法を紹介しますが、データをロードしたり、マルチスレッド挿入用のプログラムを作成したりするなど、データをすばやくインポートする方法は他にもあるかもしれません。この記事で説明されている方法は、SQL スクリプトを手動でインポートする場合にのみ適しています。

  1. MySQL に付属のコマンド ライン ツールを使用して、エクスポートとインポートを行います。
  2. 拡張挿入メソッドを使用して、複数の値を 1 回挿入します。
  3. innodb_flush_log_at_trx_commit および sync_binlog パラメータを一時的に変更します。
  4. binlog を閉じるか、一時的に binlog を記録しないようにします。

実際には、最初にインデックスを作成せず、データを挿入してからインデックスを追加する、または最初にテーブルを MyISAM または MEMORY エンジンに変更し、インポートが完了した後に InnoDB エンジンに変更するなど、他のいくつかの解決策があります。

おすすめ

転載: blog.csdn.net/Ahuuua/article/details/126388480