ホームページ  >  記事  >  データベース  >  MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

coldplay.xixi
coldplay.xixi転載
2020-12-21 17:43:293311ブラウズ

mysql チュートリアルバッチ SQL 挿入のカラム概要

MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

推奨 (無料): mysql チュートリアル

大量のデータを含む一部のシステムでは、クエリ効率が低いことに加えて、データベースが次のような問題に直面します。データがデータベースに保存されるまでに時間がかかるだけです。特にレポート システムの場合、データのインポートに費やす時間が毎日数時間から 10 時間以上かかる場合があります。したがって、データベース挿入のパフォーマンスを最適化することは理にかなっています。

#1 つの SQL ステートメントで複数のデータが挿入される

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
    VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
    VALUES ('1', 'userid_1', 'content_1', 1);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`) 
    VALUES ('0', 'userid_0', 'content_0', 0), ('1', 'userid_1', 'content_1', 1);
    SQL 実行の効率が高くなる主な理由は次のとおりです。マージ ログ (mysql の binlog および InnoDB のトランザクション ログ) の量が削減され、データ量とログ フラッシュの頻度が減り、効率が向上します。
  • SQL ステートメントをマージすることにより、SQL ステートメントの解析数を減らし、ネットワーク送信 IO を削減することもできます。
データをそれぞれテストおよび比較し、単一のデータをインポートし、それをインポート用の SQL ステートメントに変換します。


MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

#トランザクションでの挿入処理

START TRANSACTION;INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('1', 'userid_1', 'content_1', 1);...COMMIT;

トランザクションを使用すると、データ挿入の効率が向上します。これは、挿入操作が実行されると、MySQL の内部でトランザクションが作成され、実際の挿入処理操作がトランザクション内で実行されるためです。
  • トランザクションを使用して、トランザクション作成の消費を削減します。すべての挿入は実行前に送信されます。
  • データのテストと比較。トランザクションに適用されない書き込みテストとトランザクション操作を使用したテストに分割されます。

MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

データの規則的な挿入

データの規則的な挿入とは、シーケンシャルソート

INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('2', 'userid_2', 'content_2',2);
INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('0', 'userid_0', 'content_0', 0);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('1', 'userid_1', 'content_1', 1);INSERT INTO `insert_table` (`datetime`, `uid`, `content`, `type`)     VALUES ('2', 'userid_2', 'content_2',2);
データベースは挿入時にインデックスデータを維持する必要があるため、不要なレコードがあるとインデックスを維持するコストが増加します。
InnoDB で使用される B ツリー インデックスを参照してください。挿入された各レコードがインデックスの最後にある場合、インデックスの配置効率が非常に高く、インデックスの調整が少なくなります。 ; 挿入されたレコードがインデックスの途中で B ツリーを分割およびマージする必要がある場合、より多くのコンピューティング リソースが消費され、挿入されたレコードのインデックス配置効率が低下します。頻繁なディスク操作。

テスト比較データ、ランダム データとシーケンシャル データのパフォーマンス比較

MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

最初にインデックスを削除し、 insert 完了後のインデックスの再構築

包括的なパフォーマンス テスト

MySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明

データのマージトランザクション データ量が少ないときはメソッドのパフォーマンスが明らかに向上しますが、データ量が多いときは急激にパフォーマンスが低下します。これは、データ量が innodb_buffer の容量を超えるためです。各位置決めインデックスはより多くのディスクを使用します。読み取りおよび書き込み操作が行われ、パフォーマンスがより速く低下します。
  • データ トランザクションをマージする順序どおりの方法は、データ ボリュームが数千万に達した場合でも適切に実行されます。データ ボリュームが大きい場合は、順序付きデータ インデックスの配置がより便利であり、頻繁に読み取りおよび書き込み操作を行う必要がありません。より高い値を維持できます

#注意事項##SQL ステートメントには長さの制限があるため、マージするときはデータ SQL の長さ制限は、同じ SQL 内で超えてはなりません。この制限は、

max_allowed_pa​​cket
    構成を通じて変更できます。デフォルトは
  • 1M

    ですが、8M# に変更できます。 ## テスト中。 トランザクションのサイズを制御する必要があります。大きすぎると実行効率に影響する可能性があります。 MySQL には innodb_log_buffer_size

    という設定項目があり、この値を超えると innodb データがディスクにフラッシュされるため、効率が低下します。したがって、より良いアプローチは、データがこの値に達する前にトランザクションのコミットを実行することです。

以上がMySQLのバッチSQL挿入のパフォーマンス最適化の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。