問題は、MySQL InnoDBテーブルでのSELECTとUPDATEの同時動作についてです。
比較的大きなテーブルがあり、LastUpdateなどのフィールドを含むいくつかのフィールドを定期的にスキャンして読み取ります。スキャン中に、以前にスキャンされた行を更新します。更新はバッチ処理され、別の接続を使用してバックグラウンドスレッドで実行されます。すでに読み取られた行を更新することに注意することが重要です。
3つの質問:
SELECT
がまだ進行中なので、InnoDBは更新された行の以前のバージョンを保存しますか?SELECT
ヘルプにREAD-UNCOMMITTED
を使用しますか?InnoDBは常に前のバージョンの行を保存します。すべてが書き込み時コピーであるため、すべての更新は選択->コピー->書き込みです。どれくらいの期間保管されるかは、
最近のバージョンでは、パージ動作が大幅に改善されました。詳細については、dev.mysql.comを参照してください。
どういう意味かわかりません。最初に読んで次に更新するので、あまりメリットはありません。ほとんどの場合、READ-COMMITTED分離レベルを下回る必要はありません。これにより、多くのロックの問題( ギャップロック および 次のキーのロック )がすでになくなります。
InnoDB REDOログには、システム障害が発生した場合に回復できるようにinnodbテーブルスペースで発生するevery変更が含まれます。形式は、ページポインタのオフセットと変更されたバイトです。したがって、前のバージョンが元に戻すスペース(実際のスペース)に書き込まれている場合の明示的な使用例に答えるために、InnoDBはその変更をログファイルにも書き込みます。
これが役に立てば幸いです!
詳細を調べたい場合は、常に innodb_Ruby を試してみることをお勧めします。これは、innodbファイルを調べて操作の基本原理を理解するのに非常に便利なツールです。