MySQLデータベースのトランザクションとインデックスの詳細な説明

MySQLデータベースのトランザクションとインデックスの詳細な説明

1. 事務:

トランザクションとは、すべてが成功するか、すべてが失敗する論理的な操作のセットです。

——————————————————————————————————

1. SQL実行 A: 1000元 ——> 200元を送金 B: 200元

2. SQL実行 A: 800元 ——> B: 400元

——————————————————————————————————

バッチでSQL文のグループを実行する

取引の 4 つの主な特徴:

ACID原則

1. 原子性: トランザクションは最小の実行単位であり、分割できません。トランザクションのアトミック性により、アクションは完全に完了するか、まったく影響がないかのいずれかになります。


2. 一貫性:トランザクションの実行前と実行後にデータの一貫性が維持され、同じデータを読み取る複数のトランザクションの結果は同じになります。


3. 独立性: データベースに同時にアクセスする場合、ユーザーのトランザクションは他のトランザクションによって干渉されず、同時トランザクション間のデータベースは独立しています。


4. 耐久性: トランザクションがコミットされた後。データベース内のデータに加えられた変更は永続的であり、データベースに障害が発生しても影響を受けません。 --------トランザクションコミット

同時トランザクションはどのような問題を引き起こしますか? (孤立によって生じるいくつかの問題)

一般的なアプリケーションでは、複数のトランザクションが同時に実行され、多くの場合、それぞれのタスクを完了するために同じデータに対して操作が行われます (複数のユーザーが同じデータに対して操作を行います)。並行性は必要ですが、次のような問題が発生する可能性があります。

ダーティ リード: トランザクションがデータにアクセスしてデータを変更し、この変更がデータベースにコミットされていない場合、別のトランザクションもデータにアクセスしてデータを使用します。このデータはコミットされていないため、別のトランザクションによって読み取られたデータは「ダーティ データ」となり、「ダーティ データ」に基づいて実行される操作は不正確になる可能性があります。


変更の損失: 1 つのトランザクションがデータの一部を読み取ると、別のトランザクションもそのデータにアクセスします。その後、最初のトランザクションでデータが変更されると、2 番目のトランザクションもそのデータを変更します。このように、最初のトランザクションでの変更結果は失われるため、変更の消失と呼ばれます。たとえば、トランザクション 1 はテーブル内のデータ A=20 を読み取り、トランザクション 2 も A=20 を読み取り、トランザクション 1 は A=A-1 を変更し、トランザクション 2 も A=A-1 を変更し、最終結果は A=19 となり、トランザクション 1 の変更は失われます。

反復不可能な読み取り:トランザクション内で同じデータを複数回読み取ることを意味します。このトランザクションが終了する前に、別のトランザクションもデータにアクセスします。その後、最初のトランザクションでの 2 回の読み取りの間で、最初のトランザクションによって 2 回読み取られたデータは、2 番目のトランザクションの変更により異なる可能性があります。これは、トランザクションで 2 回読み取られるデータが異なることを意味するため、非反復読み取りと呼ばれます。


ファントム リード: ファントムリードは、反復不可能なリードに似ています。これは、1 つのトランザクション (T1) が数行のデータを読み取り、次に別の同時トランザクション (T2) がデータを挿入するときに発生します。後続のクエリでは、最初のトランザクション (T1) によって、元々存在しなかった追加のレコードが、まるで錯覚のように見つかるため、ファントム リードと呼ばれます。

非反復読み取りとファントム読み取りの違い。

非反復読み取りの焦点は、レコードを複数回読み取り、一部の列の値が変更されたことが見つかるなどの変更です。ファントム読み取りの焦点は、レコードを複数回読み取り、レコードの数が増えたか減ったかが見つかるなどの追加または削除です。

トランザクション分離レベルとは何ですか?

READ-UNCOMMITTED -UNCOMMITTED: まだコミットされていないデータ変更の読み取りを許可する最も低い分離レベル。これにより、ダーティ リード、ファントム リード、または反復不可能な読み取りが発生する可能性があります。

READ-COMMITTED : 同時トランザクションによってコミットされたデータの読み取りを許可します。これにより、ダーティ リードは防止できますが、ファントム リードまたは反復不可能なリードは発生する可能性があります。

REPEATABLE REPEATABLE-READ( ): トランザクション自体によってデータが変更されない限り、同じフィールドの複数の読み取りの結果は一貫しています。ダーティ読み取りと繰り返し不可能な読み取りは防止できますが、ファントム読み取りは発生する可能性があります。

SERIALIZABLE( : 最高の分離レベル。ACID 分離レベルに完全に準拠しています。すべてのトランザクションは 1 つずつ順番に実行されるため、トランザクション間の干渉が発生することはありません。つまり、このレベルでは、ダーティ リード、非反復リード、ファントム リードを防ぐことができます。

MySQL のデフォルトの分離レベル:

MySQL InnoDB ストレージ エンジンでサポートされるデフォルトの分離レベルは、REPEATABLE-READ (再読み取り可能) です。 SELECT@@tx_isolation;コマンドで確認できる。

2. 索引:

MySQL のインデックスの公式定義は次のとおりです: インデックスは、MySQL がデータを効率的に取得するのに役立つデータ構造です。文の主幹を抽出することで、インデックスの本質、つまりインデックスがデータ構造であることがわかります。

MySQL インデックスで使用されるデータ構造には、主に BTree インデックスとハッシュ インデックスが含まれます。ハッシュ インデックスの場合、基礎となるデータ構造はハッシュ テーブルです。したがって、ほとんどの要件が単一レコード クエリである場合は、クエリ パフォーマンスが最も高速なハッシュ インデックスを選択できます。その他のほとんどのシナリオでは、BTree インデックスが推奨されます。

MySQL の BTree インデックスは B ツリー内の B+Tree を使用しますが、2 つの主要なストレージ エンジンの実装方法は異なります。

MyISAM: B+Tree リーフ ノードのデータ フィールドには、データ レコードのアドレスが格納されます。インデックスの取得中、まず B+Tree 検索アルゴリズムに従ってインデックスが検索されます。指定されたキーが存在する場合は、そのデータ フィールドの値が取得され、次にデータ フィールドの値をアドレスとして使用して対応するデータ レコードが読み取られます。これは「非クラスター化インデックス」と呼ばれます。

InnoDB: データ ファイル自体がインデックス ファイルです。 MyISAM と比較すると、インデックス ファイルとデータ ファイルが分離されており、テーブル データ ファイル自体は B+Tree によって編成されたインデックス構造であり、ツリーのリーフ ノード データ フィールドに完全なデータ レコードが格納されます。このインデックスのキーはデータ テーブルの主キーであるため、InnoDB テーブル データ ファイル自体が主インデックスになります。これはクラスター化インデックスと呼ばれます。残りのインデックスは補助インデックスとして使用されます。補助インデックスのデータフィールドには、MyISAM とは異なり、アドレスではなく、対応するレコードの主キーの値が格納されます。主インデックスに基づいて検索する場合は、キーが配置されているノードを直接見つけてデータを取得できます。補助インデックスに基づいて検索する場合は、まず主キーの値を取得してから、主インデックスを調べる必要があります。したがって、テーブルを設計するときには、長すぎるフィールドを主キーとして使用したり、非単調なフィールドを主キーとして使用したりすることはお勧めしません。主インデックスが頻繁に分割される原因となるためです。

インデックスの役割:

  • クエリ速度の向上
  • データの一意性を確保する
  • テーブル間の接続を高速化し、テーブル間の参照整合性を実現できます。
  • データ取得にグループ化句と並べ替え句を使用すると、グループ化と並べ替えにかかる時間が大幅に短縮されます。
  • 検索最適化のための全文検索フィールド。

インデックス分類:

  • 主キー

一意の識別子、主キーは繰り返すことができず、主キーとして使用できる列は 1 つだけです。

  • ユニークインデックス

重複する列は避けてください。一意のインデックスは繰り返すことができます。複数の列を一意のインデックスとして識別できます。

  • 従来型インデックス

デフォルトでは、インデックスまたはキーキーワードを使用して設定します。

  • 全文索引

特定のデータベースエンジン、MylSAMでのみ利用可能

データを素早く見つける

インデックス基準:

  • インデックスの数が増えれば増えるほど良いわけではない
  • 頻繁に変更されるデータをインデックスしない
  • データ量が少ないテーブルにはインデックスを追加しないことをお勧めします。
  • 通常、検索条件のフィールドにインデックスを追加する必要があります。

インデックスのデータ構造:

-- 上記のインデックスを作成するときに、インデックスの種類を指定できます。ハッシュ タイプのインデックスには、単一クエリ用の高速インデックスと範囲クエリ用の低速イン​​デックスの 2 種類があります。Btree タイプのインデックス: B+ ツリー。レイヤーが増えるほど、データ量が指数関数的に増加します (InnoDB がデフォルトでサポートしているため、これを使用します)
-- 異なるストレージ エンジンは異なるインデックス タイプをサポートします。InnoDB はトランザクション、行レベルのロック、B ツリー、フルテキストなどのインデックスをサポートしますが、ハッシュ インデックスはサポートしません。
MyISAM はトランザクションをサポートしていませんが、テーブル レベルのロック、B ツリー、フルテキスト、およびその他のインデックスをサポートしていますが、ハッシュ インデックスはサポートしていません。
メモリはトランザクションをサポートしていませんが、テーブル レベルのロック、B ツリー、ハッシュ、およびその他のインデックスをサポートしていますが、フルテキスト インデックスはサポートしていません。
NDB はトランザクション、行レベルのロック、ハッシュ インデックスをサポートしますが、B ツリー、フルテキスト、その他のインデックスはサポートしません。
アーカイブはトランザクションをサポートしていませんが、テーブル レベルのロックはサポートしています。B ツリー、ハッシュ、フルテキスト、およびその他のインデックスはサポートしていません。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL データベース テーブルのロック、ロック解除、およびトランザクションの削除の詳細な説明
  • MySQL データベースのインデックスとトランザクション
  • MySQL データベース トランザクション例のチュートリアル
  • GolangはMySQLデータベーストランザクションの送信とロールバックを実装します
  • MySQLデータベースのトランザクションとロックの詳細な分析
  • MySQL データベース トランザクションにおけるダーティ リード、ファントム リード、非反復リードの詳細な説明

<<:  検索ボックスと検索ボタンの境界線が重なり合わない問題を解決

>>:  HTML テーブルタグと関連する改行の問題の詳細な分析

推薦する

アイデアのパッケージ化とクラウドサービスへのアップロードにおけるプロジェクトプロセスの分析

1つ。まず、アイデアとしてパッケージ化する必要があります。私はSpringbootフレームワークプロ...

Vue 値転送の 12 の方法の概要

目次1. 父から息子へ2. 息子から父へ3. ブラザーコンポーネント通信(バス) 4. ref/re...

IDEA が Docker を統合してリモート展開を実現するための詳細な手順

1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...

Linux に nodejs 環境とパス構成をインストールするための詳細な手順

Linux に Node.js をインストールする方法は 2 つあります。1 つは簡単で、解凍して使...

Ubuntu 18.04 システムでの Redis および phpredis 拡張機能のインストールと設定の詳細な説明

この記事では、Ubuntu 18.04 に Redis と phpredis 拡張機能をインストール...

JavaScript に関する 6 つの奇妙で便利な点

目次1. 解体のヒント2. デジタルセパレーター3. try...catch...finally が...

mysql 基本操作文コマンドの詳細な説明

1. MySQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

ES6スプレッド演算子の使用例

目次スプレッド演算子とレスト演算子とは何ですか?配列スプレッド演算子残り演算子(コレクション関数)ス...

ネイティブ JavaScript メッセージボード

この記事では、参考までにメッセージボードを実装するためのJavaScriptの具体的なコードを紹介し...

Nginx で複数のドメイン名がドメインをまたいでアクセスできるようにマップを使用する方法

一般的なNginx構成ではクロスドメインが可能 サーバー{ 11111 を聞いてください。 serv...

VMware vSphere 6.7 (ESXI 6.7) のグラフィック インストール手順

環境: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-8169922...

vue-router 4 の使用例の詳しい説明

目次1. インスタンスをインストールして作成する2. vue-router4の新機能2.1 動的ルー...

Zabbixで指定時間内の変化値を設定する方法の詳細な説明

背景説明: 既存の負荷分散装置には、付加価値状態にある指標があります (増加するだけで減少しないため...

Docker デプロイメント MySQL8 クラスター (マスター 1 台とスレーブ 2 台) の実装手順

目次1. CentOS 7.9 20にDockerをインストールする2. MySQL クラスターをデ...

js 日付と時刻のフォーマット方法の例

js 日付時刻形式日付と時刻を指定された形式に変換します。例: YYYY-mm-dd HH:MM は...