2

数十万行のデータベーステーブルがあります。新しい行を入力したり、行を更新したりするには、少し時間がかかります。(の形式でupdate table set field = 1234 where id = 5678; update table set field = 912 where id = 582; ...)50回の更新を行うには、4秒または5秒かかる場合があります。

この時間を短縮するにはどうすればよいですか?設定で遊ぶ価値はありinnodb_flush_log_at_trx_commitますか?特定の接続/クエリに対してのみその設定を行うにはどうすればよいですか?

遊んでも大丈夫innodb_flush_log_at_trx_commitですか?1つのコピー(UPDATEコマンドの前または後)が正常である限り、データは重要ではありません(これは、いくらかランダムなデータ更新を設定するだけです...これらのクエリで重要なデータは変更されません)

このテーブルに対するクエリの大部分は、SELECTinnodbを使用する理由です。

ありがとう

4

1 に答える 1

3

はい、innodb_flush_log_at_trx_commit を変更しても安全です。1 (デフォルト) から 0 または 2 に変更すると、コミットごとに 1 回ではなく、1 秒あたり約 1 回のログ書き込みが発生します。つまり、現在、50 回の更新により 50 回の fsync が発生しています (自動コミットを使用していると仮定します)。これを 1 秒あたり 1 fsync に変更できます。

しかし、自動コミットを使用せず、代わりに明示的なトランザクションで 50 個の更新をラップすることによって、同様の効果を得ることができます。

  1. 自動コミットを一時的に無効にするトランザクションを開始します。
  2. 50 回の更新を実行します。
  3. 専念。

これにより、コミット時に 1 つの fsync が発生します (さらに、構成に関係なく常に行われる 1 秒あたり 1 つの fsync)。これは、スループットを向上させるのに十分な場合があります。

とは言っても、非常に粗悪なハードドライブを使用しているか、サーバーに他のトラフィックが大量にロードされていない限り、どのシステムでも 50 の fsync に 5 秒は必要ないと思います。

また、更新がインデックスの恩恵を受けていることを確認する必要があります。はテーブルの主キーであると想定できるidため、クラスター化インデックスです。しかし、私はそれを確認したいと思います。上記の質問を編集して、出力を実行SHOW CREATE TABLE <tablename>して投稿できますか?

于 2012-11-08T01:51:21.530 に答える