MySql知識点のトランザクション、インデックス、ロックの原理と使い方の解析

4100 ワード

この例では、MySqlの知識ポイントのトランザクション、インデックス、ロックの原理と使い方について説明します.皆さんの参考にしてください.具体的には以下の通りです.
取引
  • トランザクション概念
  • トランザクションは、原子間SQLクエリーのセット、または独立した作業ユニットです.データベース・エンジンが操作文のセットを実行すると、すべての操作が長時間実行され、クラッシュやその他の理由で実行できない場合は、すべての文は実行されません.つまり、トランザクション内の文は、すべて実行に成功するか、すべて実行に失敗します.
  • 取引特性ACID
  • 原子性(atomicity)
  • 1つのトランザクションは、最小のワークセルとみなされ、分割できません.トランザクション全体のすべての操作は、すべてコミットに成功するか、すべてロールバックに失敗し、一部のみ実行できません.
  • コンシステンシ(consistency)
  • データベースは、1つのコンシステンシの状態から別のコンシステンシの状態に変換されます.データベースのある状態ですべての整合性制約に合致する状態.
  • 隔離性(isolation)
  • 通常、ある事務所が行った修正は、最終的に提出される前に、他の事務には表示されません.この場合、各トランザクションが隔離され、トランザクション間が干渉しないことを保証する必要があります.
  • 持続性(durability)
  • トランザクションがコミットされると、すべての変更はデータベースに永続的に保存されます.このときシステムがクラッシュしても、修正したデータは失われません.
  • トランザクションの独立性レベル
  • READ UNCOMMITTED(未提出読み)
  • トランザクションの変更は、コミットされていなくても他のトランザクションに表示され、トランザクションはコミットされていないデータを読み取ることができ、汚れた読み取りをもたらし、重複しないことができます.
  • READ COMMITTED(提出読み)
  • ほとんどのデータベースのデフォルトレベルはREAD COMMITTED(MySQLデフォルトREPEATABLE READ)です.このレベルのトランザクションはダーティリードを解決しますが、同じクエリを2回実行したため、クエリの結果が異なるため、繰り返しリードできません.
  • REPEATABLE READ(繰り返し読み可能)
  • このレベルは汚れた読みを解決し、繰り返し読めることを保証するが、理論的には、繰り返し読める隔離レベルはやはり幻の読みを解決できない.幻の読みとは、党のある物事がある範囲内の記録を読んだとき、別の事務がその範囲内に新しい記録を挿入したことを指す.InnoDBとXtraDBストレージエンジンは、マルチバージョン同時制御MVVCによって幻読の問題を解決した.
  • SERIALIZABLE(シリアル化可能)
  • シリアル化は、トランザクションのシリアル実行を強制し、幻の読み取りを完全に回避する最も高度な分離です.簡単に言えば、SERIALIZABLEは読み取りの各行にロックをかけるため、待機タイムアウトやロック競合の問題が多くなり、実際の開発ではあまり使用されません.
    索引
  • インデックス概念
  • インデックスは、ストレージエンジンのユーザーがレコードをすばやく見つけるデータ構造です.例
    
    SELECT userName FROM user WHERE userId = 1;
    
    

    userId列にインデックスを付けると、MySQLはそのインデックスを使用してuserIdの行を見つけます.つまり、MySQLはインデックス上で値で検索し、その値を含むすべてのデータ行を返します.
  • インデックス方式
  • B-Treeインデックス
  • B-Treeデータ構造を使用してデータを格納し、ほとんどのMySQLエンジンがこのインデックスをサポートしています.B−Treeインデックスは、B−Treeがインデックス列を順次整理して格納し、範囲の検索が速いため、データへのアクセス速度を速めることができる.
  • hashインデックス
  • ハッシュ・インデックスの基本ハッシュ・テーブルは、インデックスのすべてのカラムに正確に一致するクエリだけが有効です.各ローのデータについて、ストレージエンジンはすべてのインデックス列に対してハッシュコードを計算し、ハッシュコード値は小さい.ハッシュインデックスは、すべてのハッシュコードをインデックスに格納し、各データ行へのポインタをハーステーブルに保存します.MySQLにはMemoryエンジンのみがハッシュインデックスをサポートしています.
  • インデックス・タイプ
  • 一般インデックス
  • 主なタスクデータへのアクセスを高速化
  • ユニークインデックス
  • 通常のインデックスはデータの重複を許可し、あるカラムのデータが重複しないと判断した場合、一意のインデックスを作成できます.一意のインデックスには2つのメリットがあります.インデックスはより効果的です.新しいデータを挿入し、重複した場合、MySQLは挿入を拒否します.
  • プライマリ・キー・インデックス
  • プライマリ・キー自体のデフォルトでのインデックスの作成
  • 全文インデックス
  • テキストフィールド上の通常のインデックスは、フィールド内の一番前に現れる文字列の検索操作を速めるしかなく、フィールドにいくつか以上の単語からなる大きな文字が格納されている場合は、通常のインデックスはできません.この場合、全文インデックスを使用すると、クエリ効率が比較的適切になります.一意インデックス>自己増加プライマリ・キー>プライマリ・キー挿入:プライマリ・キー>自己増加プライマリ・キー>一意インデックスロック
    ここでは主に下りレベルロックについて議論する
  • 表級
  • エンジンMyISAMは、テーブル全体をロックすると理解でき、同時に読むことができ、同時に書くことはできません.ロック中、他のプロセスではテーブルの書き込みはできません.書き込みロックの場合、他のプロセスでは読み取りは許可されません.
  • 行レベル
  • エンジンINNODBは、単独で1行の記録にロックをかけ、同時に読むことができ、同時に書くことができない.行レベルのロックはオーバーヘッドが大きく、ロックが遅い.デッドロックが発生します.ロック粒度は最小であり,ロック衝突が発生する確率は最低であり,同時度も最高である.
  • InnoDBロック行
  • InnoDBプリセットはRow-Livel Lockなので、[明示]の指定されたプライマリ・キーのみ、MySQLはRow lockを実行します.そうしないと、MySQLはTable Lockを実行します.
    例1:(プライマリ・キーを明確に指定し、このレコード、Row Lock)
    
    SELECT * FROM products WHERE id='3' FOR UPDATE;
    SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;
    
    

    例2:(プライマリ・キーを明確に指定し、このレコードがない場合はlockなし)
    
    SELECT * FROM products WHERE id='-1' FOR UPDATE;
    
    

    例3:(プライマリ・キーなし、table lock)
    
    SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
    
    

    例4:(主キー不明、table lock)
    
    SELECT * FROM products WHERE id<>'3' FOR UPDATE;
    
    

    例5:(主キー不明、table lock)
    
    SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
    
    

    注意1:FOR UPDATEはInnoDBにのみ適用され、取引ブロック(BEGIN/COMMIT)で有効にする必要があります.注2:ロックの状況をテストするには、MySQLのCommand Modeを利用して、2つのウィンドウを開いてテストを行うことができます.
    MySQLに関する詳細については、「MySQLインデックス操作テクニック要約」、「MySQL常用関数大要約」、「MySQLログ操作テクニック大全」、「MySQLトランザクション操作テクニック要約」、「MySQLストレージプロセステクニック大全」および「MySQLデータベースロック関連テクニック要約」を参照してください.
    本明細書では、MySQLデータベース・メーターについて説明します.