私はInnoDBのundoログについて読んでいて、その過程で読んでいた記事は、undoログとは何か、それらが履歴リストとどのように異なっているか、またはどちらが同じであるかについて混乱してしまいました。
MariaDBチームの記事1を引用すると、履歴リストは次のように定義されています。
データのグローバル履歴リストもあります。トランザクションがコミットされると、その履歴がこの履歴リストに追加されます。リストの順序は、コミットの発生順です。
その後、同じ記事でさらに次のように述べています。これにより、元に戻すログ、履歴リスト、見かけ上の元に戻すログ内の行のビューの関係がさらに混乱します。
元に戻すログがどのように機能するかを理解することは、長いトランザクションの悪影響を理解するのに役立ちます。
Perconaによる2番目の記事[2]は、履歴リストを次のように説明しています。
履歴リストの長さ6は、取り消しスペース内のパージされていないトランザクションの数です。更新を行ったトランザクションがコミットされると増加し、パージが実行されると減少します。
そして最後に、3番目の記事[3]は、履歴リストの多くによって混乱に対処しようとしましたが、私の意見では、履歴ログと元に戻すログを区別すること、およびそれらの両方がMVCCサポートによって整合性を強制するためにinnodbトランザクションを実行する行です。3番目の記事で履歴リストを定義した方法を次に示します。
ユニット(履歴リスト)の最適な名前は、「コミットされたトランザクションの更新取り消しログ」である取り消しログで、ソースを引用します。ただし、「ログの取り消し」はInnoDBで特定の意味を持つ特別な用語です。元に戻すログは、トランザクションが行う単一のアトミック変更のセットであり、実際には複数のレコードを変更する場合があります。
最初の記事[1]はこれをさらに混乱させるために追加しました:
元に戻すログがどのように機能するかを理解することは、長いトランザクションの悪影響を理解するのに役立ちます。
トランザクションが長いと、元に戻すログに古いバージョンの行がいくつか生成されます。他の長いトランザクションがそれらを必要とするため、これらの行はおそらくより長い時間必要になります。これらのトランザクションはより多くの変更された行を生成するため、一種の組み合わせの爆発が観察されます。したがって、元に戻すログにはより多くのスペースが必要です。
トランザクションは、履歴リスト内の非常に古いバージョンの行を読み取る必要がある場合があるため、パフォーマンスが低下します。
InnoDB元に戻すログには2種類のデータが含まれていますか。1つはトランザクションがリンクリストとして保存されて使用する行のビューであり、もう1つは履歴リストで、バッファープールでコミットされたトランザクションを追跡します(まだディスクにフラッシュされていません)。 )?誰かが元に戻すログと、それらが行のビュー(実行中のトランザクションで使用するために作成された)と履歴リストとの関係を明確に区別するのを手伝ってくれませんか?
[1] https://mariadb.com/kb/en/library/xtradbinnodb-undo-log/
[2] https://www.percona.com/blog/2006/07/17/show-innodb-status-walk-through/
[3] https://www.vividcortex.com/blog/2015/07/20/what-is-innodb-history-list-length/
私はこれでスイングします:私の同僚と私は、これに対して簡潔で正確な答えを出す方法に注ぎ込んでいます。
元に戻すログとは何か、および履歴リストとの違いについて
データを変更すると、元に戻すログが生成されます。たとえば、トランザクションがINSERT、UPDATE、DELETEを使用してデータを変更する場合、操作ごとに個別の取り消しログが作成されます。トランザクションがコミットされると、MySQLはそのトランザクションで作成された取り消しログを自由にパージできます。トランザクションと元に戻すログの間には1対多の関係があります(操作ごとに1つ、覚えておいてください)。
私の理解は、Innodb History List Length
は、元に戻すログの個別の操作の数です。取り消しログは、ロールバックセグメントと呼ばれる構造の一部であり、グローバルテーブルスペース(ibdata1)またはUNDOテーブルスペース(MySQL 8.0の最近の機能)にあります。
InnoDB元に戻すログには2つのタイプのデータが含まれていますか。1つはリンクリストとして保存され、トランザクションが使用する行のビューであり、もう1つは履歴リストです。
いいえ。元に戻すログには、データを以前の状態に戻す方法に関する指示が含まれており、他のトランザクションが古いバージョンの行を表示する必要がある場合は、元に戻すログ(ロールバックの指示)を使用して、読み取りビューであり、以前のバージョンのデータを表示します。
バックグラウンドでのパージ操作(Postgresのバキュームに類似)があり、ガベージコレクションにより古くなったundoログが削除されます。最も古いライブトランザクションまでしかパージされない場合があります。
私の答えがあなたが物事をもう少し明確に視覚化するのに役立つことを願っています。さらに整理することができる場合は編集します。またはInnoDBの専門家が参加したい場合は、そうしてください。