MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

MySql の知識ポイント: トランザクション、インデックス、ロックの原則、使用状況の分析

この記事では、トランザクション、インデックス、ロックなどの MySQL の知識ポイントの原理と使用法を例を使用して説明します。ご参考までに、詳細は以下の通りです。

取引

  • 取引コンセプト

トランザクションは、一連のアトミック SQL クエリ、または独立した作業単位です。データベース エンジンが一連の操作ステートメントを実行すると、すべての操作が実行されます。いずれかの操作がクラッシュしたり、その他の理由で実行できない場合は、すべてのステートメントは実行されません。つまり、トランザクション内のすべてのステートメントは、正常に実行されるか、すべて失敗します。

  • ACIDトランザクション特性
    • 原子性

    トランザクションは作業の最小単位とみなされ、分割できません。トランザクション全体のすべての操作は、正常にコミットされるか、すべて失敗してロールバックされる必要があります。操作の一部のみを実行することはできません。

    • 一貫性

    データベースは、ある一貫した状態から別の一貫した状態に変換されます。データベースがすべての整合性制約に準拠している状態。

    • 分離

    一般的に、1 つのトランザクションによって行われた変更は、最終的にコミットされるまで他のトランザクションには表示されません。このとき、各トランザクションが分離され、相互に干渉できないようにする必要があります。

    • 耐久性

    トランザクションがコミットされると、すべての変更がデータベースに永続的に保存されます。このとき、システムがクラッシュしても、変更されたデータは失われません。

  • トランザクション分離レベル
    • コミットされていない読み取り

    トランザクション内の変更は、コミットされていない場合でも他のトランザクションから参照できます。トランザクションはコミットされていないデータを読み取ることができるため、ダーティ リードが発生し、再現性が失われます。

    • コミットされた読み取り

    ほとんどのデータベースのデフォルト レベルは READ COMMITTED です (MySQL のデフォルトは REPEATABLE READ)。このレベルのトランザクションはダーティ リード (dirty read) を解決しますが、同じクエリが 2 回実行されるとクエリ結果が異なるため、非反復読み取りが発生する可能性があります。

    • 繰り返し読み取り

    このレベルでは、ダーティ リードが解決され、繰り返し読み取りが保証されます。ただし、理論上は、繰り返し読み取り分離レベルではファントム リードは解決できません。いわゆるファントム リードとは、あるトランザクションが特定の範囲内のレコードを読み取っているときに、別のトランザクションが同じ範囲内に新しいレコードを挿入する状況を指します。 InnoDB および XtraDB ストレージ エンジンは、マルチバージョン同時実行制御 (MVVC) を通じてファントム リードの問題を解決します。

    • シリアル化可能

    直列化可能性は、最高レベルの分離です。トランザクションを直列に実行するように強制し、ファントム リードを完全に回避します。簡単に言うと、SERIALIZABLE は各行の読み取りをロックするため、待機タイムアウトが大量に発生し、ロック競合の問題が発生します。実際の開発ではほとんど使用されません。

索引

  • インデックスコンセプト

インデックスは、ストレージエンジンのユーザーがレコードを素早く見つけられるようにするデータ構造です。例えば、

userId = 1 の場合、userName を user から選択します。

userId 列にインデックスを追加すると、MySQL はインデックスを使用して userId の行を検索します。つまり、MySQL は最初に値でインデックスを検索し、次にその値を含むすべてのデータ行を返します。

  • インデックス作成
    • Bツリーインデックス

    データの保存には B-Tree データ構造を使用します。ほとんどの MySQL エンジンはこのインデックスをサポートしています。 B-Tree インデックスでは、B-Tree インデックス列が順番に格納され、高速な範囲検索が可能になるため、データ アクセスを高速化できます。

    • ハッシュインデックス

    ハッシュ インデックスは、基本的なハッシュ テーブルとして実装されます。インデックスのすべての列と完全に一致するクエリのみが有効です。データの各行について、ストレージ エンジンはすべてのインデックス列のハッシュ コードを計算し、ハッシュ コードの値は小さくなります。ハッシュ インデックスは、すべてのハッシュ コードをインデックスに格納し、ハッシュ テーブル内の各データ行へのポインターを保存します。 MySQL では、メモリ エンジンのみがハッシュ インデックスを明示的にサポートします。

  • インデックスタイプ
    • 通常のインデックス

    主なタスク データへのアクセスを高速化する

    • ユニークインデックス

    通常のインデックスでは、データの繰り返しが許可されます。列内のデータが重複しないことが確実な場合は、一意のインデックスを作成できます。一意のインデックスには 2 つの利点があります。インデックスがより効率的です。新しいデータを挿入するときに、重複していると、MySQL は挿入を拒否します。

    • 主キーインデックス

    主キー自体はデフォルトでインデックス化されます。

    • 全文索引

    テキスト フィールドの通常のインデックスでは、フィールドの最初の文字列の検索速度のみが向上します。フィールドに複数の単語で構成される大きなテキストが含まれている場合、通常のインデックスは機能しません。この場合は、フルテキスト インデックスの方が適しています。

    クエリの効率: 一意のインデックス > 自動増分主キー > 主キー

    挿入: 主キー > 自動増分主キー > 一意のインデックス

ロック

ここでは主にダウンリンクレベルのロックについて説明します。

  • テーブルレベル

MyISAM エンジンは、テーブル全体をロックするものと理解できます。同時に読み取ることはできますが、同時に書き込むことはできません。ロック期間中、他のプロセスはテーブルに書き込むことができません。書き込みロックの場合、他のプロセスは読み取りできません。

  • 行レベル

エンジン INNODB では、レコードの 1 行がロックされ、同時に読み取ることはできますが、同時に書き込むことはできません。行レベルのロックはオーバーヘッドが高く、ロックが遅く、デッドロックが発生する可能性があります。ロックの粒度は最小で、ロック競合の可能性は最も低く、同時実行性は最も高くなります。

  • InnoDB ロック行

InnoDB はデフォルトで行レベル ロックを実行するため、MySQL は主キーが明示的に指定されている場合にのみ行ロックを実行します。それ以外の場合、MySQL はテーブル ロックを実行します。

例1: (主キーを明示的に指定し、そのようなレコードがある場合は行ロック)

SELECT * FROM products WHERE id='3' FOR UPDATE;
SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;

例 2: (主キーを明示的に指定します。そのようなレコードが見つからない場合は、ロックは実行されません)

SELECT * FROM products WHERE id='-1' FOR UPDATE;

例 3: (主キーなし、テーブルロック)

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例 4: (主キーが不明、テーブルロック)

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例 5: (主キーが不明、テーブルロック)

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

注 1: FOR UPDATE は InnoDB にのみ適用可能であり、有効にするにはトランザクション ブロック (BEGIN/COMMIT) で実行する必要があります。
注 2: ロック状態をテストするには、MySQL のコマンド モードを使用し、2 つのウィンドウを開いてテストを実行します。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQLインデックストランザクションの詳細な分析
  • MySQL データベースのインデックスとトランザクション
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • Mysql データベースの高度なビュー、トランザクション、インデックス、自己接続、ユーザー管理の例の分析の使用
  • MySql のインデックス、ロック、トランザクションの知識ポイントのまとめ
  • MySQL トランザクション インデックスの知識の概要

<<:  リアクトルーティングガード(ルーティングインターセプション)の実装

>>:  Linuxのlocateコマンドの使い方

推薦する

HTML の左右レイアウトのサンプルコード

CS: ...コードをコピーコードは次のとおりです。 html,body{ margin:0px; ...

CentOS 上の Docker に Jupyter をインストールしてポートを開く方法

目次jupyterをインストールするDocker ポートマッピングjupyterをインストールするp...

Vueプロジェクトのパッケージングと展開の実際のプロセスの記録

目次序文1. 準備 - サーバーとnginxの使用1. サーバーを準備する2. nginxをインスト...

Linux ブートシステム方式の分析

この記事では、Linux システムを起動する方法について説明します。ご参考までに、詳細は以下の通りで...

CSS3 疑似クラスセレクターの簡単なレビュー

序文CSS がフロントエンド開発の基本的なスキルであるならば、「セレクター」は基礎中の基礎です。これ...

HTML マークアップ言語 - フォーム

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

HTML ではスペースはどのように表現されますか (どのような意味ですか)?

Web 開発では、次のような文字によく遭遇します: &nbsp;これは実際には HTML が...

MySQL での一時テーブルの使用例

ここ2日間ちょっと忙しくて、公式アカウントも数日更新が止まってしまいました。その結果、何人かの読者か...

Centos7 で MySQL マスター スレーブ サーバーを構築する方法 (グラフィック チュートリアル)

この記事では主に CentOS 上で MySQL マスタースレーブサーバーを構築する方法を紹介します...

MySQL インデックスがソートに与える影響の分析例

この記事では、例を使用して、MySQL インデックスがソートに与える影響を説明します。ご参考までに、...

MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

序文私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉...

VUEウォッチリスナーの基本的な使い方の詳しい説明

目次1. 次のコードはwatchの簡単な使用法です2. 即時監視3. ハンドラメソッド4. 深い属性...

WeChatアプレット仮想リストの応用例

目次序文仮想リストとは何ですか?デモ効果準備スクリーンの高さとボックスの高さ最適化要約する序文人気の...

nginxプロセスロックの実装の詳細な説明

目次1. nginxプロセスロックの役割2. エントリーレベルのロックの使用3. nginxプロセス...

スペース均等互換性の問題を解決する2つの方法についての簡単な説明

flex は 2009 年のリリース以来、ほぼすべてのブラウザでサポートされています。シンプルでレス...