検索
ホームページデータベースmysql チュートリアル[MySQL] マルチバージョン同時実行制御


MySQL のほとんどのトランザクション ストレージ エンジンの実装は、単純な行レベルのロックではありません。同時実行パフォーマンスの向上を考慮して、通常はマルチバージョン同時実行制御 (MVCC) を同時に実装します。 MySQL だけでなく、Oracle や PostgreSQL などのデータベース システムも MVCC を実装していますが、MVCC には統一された標準がないため、実装メカニズムが異なります。

MVCC は行レベルのロックの一種と考えることができますが、多くの場合ロック操作が回避されるため、オーバーヘッドが低くなります。実装メカニズムは異なりますが、そのほとんどはノンブロッキング読み取り操作を実装し、書き込み操作は必要な行のみをロックします。

MVCC は、特定の時点でのデータのスナップショットを保存することによって実装されます。つまり、実行にどれだけ時間がかかっても、各トランザクションで表示されるデータは一貫しています。トランザクションの開始時刻に応じて、同じテーブル上の各トランザクションで同時に表示されるデータが異なる場合があります。

異なるストレージ エンジンの MVCC 実装は異なり、通常はオプティミスティック同時実行制御とペシミスティック同時実行制御です。以下では、InnoDB の動作の簡略化されたバージョンを通じて MVCC がどのように機能するかを示します。

InnoDB の MVCC は、レコードの各行の背後に 2 つの非表示列を保存することによって実装されます。これら 2 つの列のうち、1 つは行の作成時刻を保持し、もう 1 つは行の有効期限 (または削除時刻) を保持します。もちろん、保存されるのは実際の時間値ではなく、システムのバージョン番号です。新しいトランザクションが開始されるたびに、システムのバージョン番号が自動的に増加します。事務。トランザクション開始時のシステム バージョン番号はトランザクションのバージョン番号として使用され、クエリされたレコードの各行のバージョン番号と比較するために使用されます。具体的に REPEATABLE READ 分離レベルで MVCC がどのように動作するかを見てみましょう。

SELECT

InnoDB は、次の 2 つの条件に基づいてレコードの各行をチェックします:

  • InnoDB は、バージョン番号が現在のトランザクション バージョンより前のデータ行のみを検索します (つまり、行のシステム バージョン番号がこれにより、トランザクションによって読み取られた行が、トランザクションの開始前にすでに存在していたか、トランザクション自体によって挿入または変更されたことが保証されます。

  • 行の削除されたバージョンは、未定義であるか、現在のトランザクションのバージョン番号より大きいです。これにより、トランザクションによって読み取られた行が、トランザクションの開始前に削除されていないことが保証されます。

上記の 2 つの条件を満たすレコードのみがクエリ結果として返されます。

INSERT

InnoDB は、挿入された各行の行バージョン番号として現在のシステム バージョン番号を保存します。

DELETE

InnoDB は、現在のシステムのバージョン番号を、削除された各行の行削除識別子として保存します。

UPDATE

InnoDB は、新しいレコード行を挿入し、現在のシステム バージョン番号を行バージョン番号として保存し、現在のシステム バージョン番号を行削除識別子として元の行に保存します。

ほとんどのデータ読み取り操作をロックせずに実行できるように、これら 2 つの追加のシステム バージョン番号を保存します。この設計により、データ読み取り操作が非常にシンプルになり、パフォーマンスが非常に向上し、また、規格を満たす行のみが確実に読み取られるようになります。欠点は、レコードの各行に追加の記憶域スペース、より多くのチェック、および追加のメンテナンスが必要になることです。

MVCC は、REPEATABLE READ と READ COMMITTED の 2 つの分離レベルでのみ機能します。 READ UNCOMMITTED は、現在のトランザクション バージョンに準拠するデータ行ではなく、常に最新のデータ行を読み取るため、他の 2 つの分離レベルは MVCC と互換性がありません。 SERIALIZABLE は、読み取られたすべての行をロックします。

注: MVCC には正式な仕様がないため、各ストレージ エンジンとデータベース システムの実装は異なります。他の方法が間違っているとは誰も言えません。

MySQL のほとんどのトランザクション ストレージ エンジンの実装は、単純な行レベルのロックではありません。同時実行パフォーマンスの向上を考慮して、通常はマルチバージョン同時実行制御 (MVCC) を同時に実装します。 MySQL だけでなく、Oracle や PostgreSQL などの他のデータベース システムも MVCC を実装していますが、MVCC には統一された標準がないため、実装メカニズムが異なります。

MVCC は行レベルのロックの一種と考えることができますが、多くの場合ロック操作が回避されるため、オーバーヘッドが低くなります。実装メカニズムは異なりますが、そのほとんどはノンブロッキング読み取り操作を実装し、書き込み操作は必要な行のみをロックします。

MVCC は、特定の時点でのデータのスナップショットを保存することによって実装されます。つまり、実行にどれだけ時間がかかっても、各トランザクションで表示されるデータは一貫しています。トランザクションの開始時刻に応じて、同じテーブル上の各トランザクションで同時に表示されるデータが異なる場合があります。

異なるストレージ エンジンの MVCC 実装は異なり、通常はオプティミスティック同時実行制御とペシミスティック同時実行制御です。以下では、InnoDB の動作の簡略化されたバージョンを通じて MVCC がどのように機能するかを示します。

InnoDB の MVCC は、レコードの各行の背後に 2 つの非表示の列を保存することによって実装されます。これら 2 つの列のうち、1 つは行の作成時刻を保持し、もう 1 つは行の有効期限 (または削除時刻) を保持します。もちろん、保存されるのは実際の時間値ではなく、システムのバージョン番号です。新しいトランザクションが開始されるたびに、システムのバージョン番号が自動的に増加します。事務。トランザクション開始時のシステム バージョン番号はトランザクションのバージョン番号として使用され、クエリされたレコードの各行のバージョン番号と比較するために使用されます。具体的に REPEATABLE READ 分離レベルで MVCC がどのように動作するかを見てみましょう。

SELECT

InnoDB は、次の 2 つの条件に基づいてレコードの各行をチェックします:

  • InnoDB は、バージョン番号が現在のトランザクション バージョンより前のデータ行のみを検索します (つまり、行のシステム バージョン番号がこれにより、トランザクションによって読み取られた行が、トランザクションの開始前にすでに存在していたか、トランザクション自体によって挿入または変更されたことが保証されます。

  • 行の削除されたバージョンは、未定義であるか、現在のトランザクションのバージョン番号より大きいです。これにより、トランザクションによって読み取られた行が、トランザクションの開始前に削除されていないことが保証されます。

上記の 2 つの条件を満たすレコードのみがクエリ結果として返されます。

INSERT

InnoDB は、挿入された各行の行バージョン番号として現在のシステム バージョン番号を保存します。

DELETE

InnoDB は、現在のシステムのバージョン番号を、削除された各行の行削除識別子として保存します。

UPDATE

InnoDB は、新しいレコード行を挿入し、現在のシステム バージョン番号を行バージョン番号として保存し、現在のシステム バージョン番号を行削除識別子として元の行に保存します。

ほとんどのデータ読み取り操作をロックせずに実行できるように、これら 2 つの追加のシステム バージョン番号を保存します。この設計により、データ読み取り操作が非常にシンプルになり、パフォーマンスが非常に向上し、また、規格を満たす行のみが確実に読み取られるようになります。欠点は、レコードの各行に追加の記憶域スペース、より多くのチェック、および追加のメンテナンスが必要になることです。

MVCC は、REPEATABLE READ と READ COMMITTED の 2 つの分離レベルでのみ機能します。 READ UNCOMMITTED は、現在のトランザクション バージョンに準拠するデータ行ではなく、常に最新のデータ行を読み取るため、他の 2 つの分離レベルは MVCC と互換性がありません。 SERIALIZABLE は、読み取られたすべての行をロックします。

注: MVCC には正式な仕様がないため、各ストレージ エンジンとデータベース システムの実装は異なります。他の方法が間違っているとは誰も言えません。

上記は [MySQL] マルチバージョン同時実行制御の内容です。さらに関連する内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Innodb Redoログの役割を説明し、ログを元に戻します。Innodb Redoログの役割を説明し、ログを元に戻します。Apr 15, 2025 am 12:16 AM

INNODBは、レドログと非論的なものを使用して、データの一貫性と信頼性を確保しています。 1.レドログは、クラッシュの回復とトランザクションの持続性を確保するために、データページの変更を記録します。 2.Undologsは、元のデータ値を記録し、トランザクションロールバックとMVCCをサポートします。

説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?説明出力(タイプ、キー、行、追加)で探す重要なメトリックは何ですか?Apr 15, 2025 am 12:15 AM

説明コマンドのキーメトリックには、タイプ、キー、行、および追加が含まれます。 1)タイプは、クエリのアクセスタイプを反映しています。値が高いほど、constなどの効率が高くなります。 2)キーは使用されているインデックスを表示し、nullはインデックスがないことを示します。 3)行はスキャンされた行の数を推定し、クエリのパフォーマンスに影響します。 4)追加の情報を最適化する必要があるというFilesortプロンプトを使用するなど、追加情報を提供します。

説明の一時的なステータスを使用し、それを回避する方法は何ですか?説明の一時的なステータスを使用し、それを回避する方法は何ですか?Apr 15, 2025 am 12:14 AM

Temporaryを使用すると、MySQLクエリに一時テーブルを作成する必要があることが示されています。これは、異なる列、またはインデックスされていない列を使用して順番に一般的に見られます。インデックスの発生を回避し、クエリを書き直し、クエリのパフォーマンスを改善できます。具体的には、expliect出力に使用を使用する場合、MySQLがクエリを処理するために一時テーブルを作成する必要があることを意味します。これは通常、次の場合に発生します。1)個別またはグループビーを使用する場合の重複排除またはグループ化。 2)Orderbyに非インデックス列が含まれているときに並べ替えます。 3)複雑なサブクエリを使用するか、操作に参加します。最適化方法には以下が含まれます。1)OrderbyとGroupB

さまざまなSQLトランザクションの分離レベル(読み取り、commited、繰り返し読み取り、シリアル化可能、シリアル化可能)とmysql/innodbの意味を説明してください。さまざまなSQLトランザクションの分離レベル(読み取り、commited、繰り返し読み取り、シリアル化可能、シリアル化可能)とmysql/innodbの意味を説明してください。Apr 15, 2025 am 12:11 AM

MySQL/INNODBは、4つのトランザクション分離レベルをサポートしています。 1.ReadunCommittedは、知らないデータを読み取ることができます。 2。読み込みは汚い読み取りを回避しますが、繰り返しのない読みが発生する可能性があります。 3. RepeatablerEadはデフォルトレベルであり、汚い読み取りと非回復不可能な読みを避けますが、幻の読み取りが発生する可能性があります。 4. Serializableはすべての並行性の問題を回避しますが、同時性を低下させます。適切な分離レベルを選択するには、データの一貫性とパフォーマンス要件のバランスをとる必要があります。

MySQL対その他のデータベース:オプションの比較MySQL対その他のデータベース:オプションの比較Apr 15, 2025 am 12:08 AM

MySQLは、Webアプリケーションやコンテンツ管理システムに適しており、オープンソース、高性能、使いやすさに人気があります。 1)PostgreSQLと比較して、MySQLは簡単なクエリと高い同時読み取り操作でパフォーマンスが向上します。 2)Oracleと比較して、MySQLは、オープンソースと低コストのため、中小企業の間でより一般的です。 3)Microsoft SQL Serverと比較して、MySQLはクロスプラットフォームアプリケーションにより適しています。 4)MongoDBとは異なり、MySQLは構造化されたデータおよびトランザクション処理により適しています。

MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?MySQL Index Cardinalityはクエリパフォーマンスにどのように影響しますか?Apr 14, 2025 am 12:18 AM

MySQLインデックスのカーディナリティは、クエリパフォーマンスに大きな影響を及ぼします。1。高いカーディナリティインデックスは、データ範囲をより効果的に狭め、クエリ効率を向上させることができます。 2。低カーディナリティインデックスは、完全なテーブルスキャンにつながり、クエリのパフォーマンスを削減する可能性があります。 3。ジョイントインデックスでは、クエリを最適化するために、高いカーディナリティシーケンスを前に配置する必要があります。

MySQL:新規ユーザー向けのリソースとチュートリアルMySQL:新規ユーザー向けのリソースとチュートリアルApr 14, 2025 am 12:16 AM

MySQL学習パスには、基本的な知識、コアの概念、使用例、最適化手法が含まれます。 1)テーブル、行、列、SQLクエリなどの基本概念を理解します。 2)MySQLの定義、作業原則、および利点を学びます。 3)インデックスやストアドプロシージャなどの基本的なCRUD操作と高度な使用法をマスターします。 4)インデックスの合理的な使用や最適化クエリなど、一般的なエラーのデバッグとパフォーマンス最適化の提案に精通しています。これらの手順を通じて、MySQLの使用と最適化を完全に把握できます。

実際のmysql:例とユースケース実際のmysql:例とユースケースApr 14, 2025 am 12:15 AM

MySQLの実際のアプリケーションには、基本的なデータベース設計と複雑なクエリの最適化が含まれます。 1)基本的な使用法:ユーザー情報の挿入、クエリ、更新、削除など、ユーザーデータの保存と管理に使用されます。 2)高度な使用法:eコマースプラットフォームの注文や在庫管理など、複雑なビジネスロジックを処理します。 3)パフォーマンスの最適化:インデックス、パーティションテーブル、クエリキャッシュを使用して合理的にパフォーマンスを向上させます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール