2

高速データ ストリームを消費しており、次の手順を実行して MySQL データベースにデータを保存しています。新着アイテムごとに。

  • (1) 着信アイテムを解析します。
  • (2) 「INSERT ... ON DUPLICATE KEY UPDATE」を数回実行する

INSERT ... ON DUPLICATE KEY UPDATEを使用して、データベースへの追加のラウンドトリップを 1 回排除しました。

全体的なパフォーマンスを改善しようとしている間、次の方法で一括更新を行うことを検討しました。

  • (1) 着信アイテムを解析します。
  • (2) "INSERT ... ON DUPLICATE KEY UPDATE" で SQL ステートメントを生成し、ファイルに追加します。

ファイル内の SQL ステートメントを定期的にデータベースにフラッシュします。

2 つの質問:

  • (1) これはデータベースの負荷に良い影響を与えますか?
  • (2)完全なフラッシュ後にのみインデックスが再構築されるように、ステートメントをデータベースにフラッシュするにはどうすればよいですか? (トランザクションを使用していますか?)

更新: Perl DBI + MySQL MyISAM を使用しています。

コメントをお寄せいただきありがとうございます。

4

2 に答える 2

3

データをすぐにデータベースに入れる必要がない場合は、挿入データをどこかにキャッシュしてから、より大きな挿入ステートメントを 1 つ発行できます。

重複更新時に table_name (x, y, z) 値 (x1, y1, z1), (x2, y2, z2), ... (xN, yN, zN) に挿入 ...;

明確にするために、保留中の挿入のリストを維持します。この場合、(x,z,y) トリプレットのリストです。次に、リストがしきい値 (N) を超えたら、insert ステートメントを生成して発行します。

正確なタイミングの数値はありませんが、各行を個別に挿入する場合と比較して、パフォーマンスが約 10 倍向上しました。

N の値も試していませんが、1000 がうまく機能することがわかりました。最適な値は、ハードウェアとデータベースの設定に影響されると思います。

これが役に立てば幸いです (私も MyIsam を使用しています)。

于 2010-01-18T18:11:39.650 に答える
2

実行しているデータベース アクセス環境 (PERL DBI? JDBC? ODBC?) の種類や、使用しているテーブル ストレージ エンジンの種類 (MyISAM? InnoDB?) については言及しません。

まず、INSERT ... ON DUPLICATE KEY UPDATE を選択するのは正しいことです。一意のキーを保証できない限り、良い動きです。

次に、データベース アクセス環境で許可されている場合は、準備済みステートメントを使用する必要があります。一連のステートメントをファイルに書き込んでから、データベース クライアントにそのファイルを再度読み取らせると、確実にパフォーマンスが向上しません。着信データ ストリームを使用するソフトウェア パッケージから INSERT 操作を直接実行します。

第 3 に、適切な種類のテーブル ストレージ エンジンを選択します。MyISAM 挿入は InnoDB よりも高速になるため、データをログに記録して後で取得する場合は、それが有利です。しかし、InnoDB の方がトランザクションの整合性が優れています。本当に大量のデータを処理していて、頻繁に読み取る必要がない場合は、ARCHIVE ストレージ エンジンを検討してください。

最後に、INSERT ... コマンドのバッチの最初に START TRANSACTION を実行し、次に COMMIT を実行し、固定行数 (100 程度) の後に別の START TRANSACTION を実行することを検討してください。InnoDB を使用している場合、これにより処理速度が大幅に向上します。MyISAM または ARCHIVE を使用している場合は問題ありません。

あなたの大きな勝利は、準備されたステートメントとストレージ エンジンの最適な選択から得られます。

于 2009-11-21T03:14:28.153 に答える