web-dev-qa-db-ja.com

MySQL MVCCの実装

問題は、MySQL InnoDBテーブルでのSELECTとUPDATEの同時動作についてです。

比較的大きなテーブルがあり、LastUpdateなどのフィールドを含むいくつかのフィールドを定期的にスキャンして読み取ります。スキャン中に、以前にスキャンされた行を更新します。更新はバッチ処理され、別の接続を使用してバックグラウンドスレッドで実行されます。すでに読み取られた行を更新することに注意することが重要です。

3つの質問:

  1. SELECTがまだ進行中なので、InnoDBは更新された行の以前のバージョンを保存しますか?
  2. SELECTヘルプにREAD-UNCOMMITTEDを使用しますか?
  3. InnoDBが以前のバージョンの変更された行をREDOログに保存するかどうかを確認するにはどうすればよいですか。
3
nimrodm
  1. InnoDBは常に前のバージョンの行を保存します。すべてが書き込み時コピーであるため、すべての更新は選択->コピー->書き込みです。どれくらいの期間保管されるかは、

    • 開いているトランザクション(明らかに、古いバージョンを表示できる必要がある開いているトランザクションがある限り、削除できません)
    • サーバーのビジー度(パージラグ)

    最近のバージョンでは、パージ動作が大幅に改善されました。詳細については、dev.mysql.comを参照してください。

  2. どういう意味かわかりません。最初に読んで次に更新するので、あまりメリットはありません。ほとんどの場合、READ-COMMITTED分離レベルを下回る必要はありません。これにより、多くのロックの問題( ギャップロック および 次のキーのロック )がすでになくなります。

  3. InnoDB REDOログには、システム障害が発生した場合に回復できるようにinnodbテーブルスペースで発生するevery変更が含まれます。形式は、ページポインタのオフセットと変更されたバイトです。したがって、前のバージョンが元に戻すスペース(実​​際のスペース)に書き込まれている場合の明示的な使用例に答えるために、InnoDBはその変更をログファイルにも書き込みます。

これが役に立てば幸いです!

詳細を調べたい場合は、常に innodb_Ruby を試してみることをお勧めします。これは、innodbファイルを調べて操作の基本原理を理解するのに非常に便利なツールです。

5
Károly Nagy