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コマンドの使い方

推薦する

「@INC で ExtUtils/MakeMaker.pm が見つかりません」というエラーを解決する

mha4mysql をインストールする場合の手順は、おおよそ次のようになります: unzip、per...

LINUX でプロセスを表示する 4 つの方法 (要約)

プロセスは CPU とメモリ内で実行されるプログラム コードであり、各プロセスは 1 つ以上のプロセ...

PXEを使用してLinuxシステムを自動的に展開する方法

目次背景DHCPの設定DHCP ファイル (動的ホスト構成プロトコル) の編集tftp 設定sysl...

Vue の this.$store.state.xx.xx に関する簡単な説明

目次これを Vue.$store.state.xx.xxストアからデータを取得する私のプロジェクトフ...

Linux の文字端末でマウスを使って赤い四角形を移動する方法

すべてがファイルです! UNIX はすでにそれを言っています。エリック・レイモンドはこう言いました。...

CSS3アニメーションを使用した簡単な指クリックアニメーションの実装例

この記事では主に、CSS3 アニメーションで簡単な指クリックアニメーションを実装する例を紹介し、皆さ...

HTMLページの文字セットを指定する2つの方法

1. HTMLページの文字セットを指定する2つの方法方法1: <メタ文字セット="u...

HTMLの最適化によりWebページの速度が向上

明らかな HTML、隠された「公開スクリプト」 Web ページのダウンロード時間を短縮する鍵は、フ...

Linux で JDK 環境を構成する方法

1. 公式ウェブサイトにアクセスして、jdk-8u162-linux-x64.tar.gzなどのLi...

HTMLタグのtarget属性の使用法

1: <a> タグを使用してページにリンクする場合、target 属性の役割は誰もが知っ...

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

UCenter ホームサイトに統計コードを追加

UCenter Homeは、ComsenzがリリースしたSNSサイト構築システムです。最新バージョン...

Windows システムの MySQL が中国語を入力および表示できない問題の解決方法

ステップ 1: メモ帳を使用して、MySQL インストール ディレクトリの「my.ini」ファイルを...

マークアップ言語 - 印刷スタイルシート

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

スクロール時に選択領域のフォント色を暗くするために CSS を使用するサンプルコード

日付ピッカーをカプセル化する場合、選択時にフォントの色を暗くする必要があります。実装後の効果を見てみ...