プロジェクトでは、次のような場合によく遭遇します。たとえば、ある時点で 100 人のユーザーが同じデータに変更を加えた場合、問題が発生し、結果のデータが不正確になります。高い同時実行性を解決する通常の方法には、読み取り時のキャッシュが含まれます。データ、書き込み データが入力されると、キューに追加されます。参考までに、高い同時実行性に対処するための一般的な方法をいくつか示します。
1. MySQL バッチ挿入の最適化
大量のデータを含む一部のシステムでは、クエリ効率が低いことに加えて、データベースは長いデータ保存時間などの問題に直面します。特にレポート システムの場合、データのインポートに費やす時間が毎日数時間から 10 時間以上かかる場合があります。したがって、データベース挿入のパフォーマンスを最適化することは理にかなっています。
MySQL innodb でいくつかのパフォーマンス テストを行った結果、挿入効率を向上させるいくつかの方法が見つかりましたので、ご参照ください。
1. 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);
変更された挿入操作により、プログラムの挿入効率が向上します。ここで 2 番目の SQL 実行効率が高い主な理由は、マージ後のログ量 (MySQL の binlog と innodb のトランザクション ログ) が減り、ログ フラッシュの量と頻度が減り、効率が向上するためです。 SQL ステートメントをマージすることにより、SQL ステートメントの解析数を減らし、ネットワーク送信 IO を削減することもできます。
ここでは、単一のデータをインポートしてインポート用の SQL ステートメントに変換するテスト比較データと、それぞれ 100、1,000、および 10,000 個のデータ レコードをテストするテスト比較データを示します。
#トランザクション内で挿入処理を行うこともできます。