MySQL データベースのインデックスとトランザクション

MySQL データベースのインデックスとトランザクション

1. 索引

1.1 コンセプト

  • インデックスは、テーブル内のデータ行の取得を高速化するために作成される分散ストレージ構造です。インデックスはテーブルに対して作成されます。インデックスはデータ ページ以外のインデックス ページで構成されます。インデックス ページの各行には、物理​​データの取得を高速化するための論理ポインターが含まれています。
  • データベース ダイアグラムでは、選択したテーブルの [インデックス/キー] プロパティ ページで各インデックス タイプを作成、編集、または削除できます。インデックスは、それが添付されているテーブルを保存するとき、またはテーブルが存在する関係グラフを保存するときに、データベースに保存されます。

簡単に言えば、データベース内のインデックスとテーブルとデータの関係は、本棚にある本 (テーブル)、本の内容 (データ)、本のカタログ (インデックス) の関係に似ています。

1.2 機能

データベース システムでインデックスを作成する主な機能は次のとおりです。

  • 迅速なデータ取得
  • データレコードの一意性を確保する
  • テーブル間の参照整合性を実装する
  • 在使用order by、 、インデックスを使用すると並べ替えとグループ化の時間を短縮できます。

1.3 索引作成の原則

1.3.1 ディスクアクセス回数を減らすことがインデックス構築の核となる考え方

インデックスの目的はクエリを容易にすることです。
MySQLクエリは主にselectです。select select基本的な実行プロセスには、テーブルをトラバースし、各レコードを順番に取り出し、where句の条件に従ってフィルタリングすることが含まれます。MySQLはハードディスクにデータを保存するため、クエリを実行するときは、各レコードがハードディスクにアクセスすることを意味します。IOデバイスのハードディスクへのアクセス効率は、メモリへのアクセス効率よりもはるかに低くなります。したがって、ディスクアクセス回数を減らすとクエリの効率が向上します。これがインデックス構築の核心的な考え方です。

1.3.2 B+ツリーは基礎となるインデックスの実装に適している

データへのアクセス回数を減らすことは、インデックスを実装する際に重要な考え方です。次に、いくつかのデータ構造を分析して、インデックスを実装するためのより適切なデータ構造を見つけます。

二分探索木:

二分探索木は単一枝木である可能性があるため、時間計算量はO(N)である。

AVLツリー:

  • AVL ツリーは、本質的にはバイナリ バランス サーチ ツリーであり、バイナリ サーチ ツリーを改良したものです。左サブツリーと右サブツリーの高さの差が 1 を超えないこと、つまり単一ブランチ ツリー構造が存在しないことが保証され、検索時間の複雑さは O(logN) です。
  • 左と右のサブツリーの高さの差は 1 を超えてはならないため、挿入または削除操作によって AVL ツリーの構造が破壊されます。そのため、ツリーはいつでも調整する必要があります。クエリの効率は満たされているものの、挿入と削除の操作の効率は低下し、挿入と削除の時間計算量はO(logN)となる。

赤黒木:

  • 赤黒木は、本質的にはルールが緩和された AVL 木です。つまり、左と右のサブツリーの高さの差が 1 以下になることを強制しないため、挿入および削除操作の効率を確保するための要件が​​低くなります。
  • AVLツリーとクエリ、挿入、削除の時間計算量の全体的な違いはO(logN)です。

ハッシュテーブル:

  • ハッシュテーブルのクエリ、挿入、削除の時間計算量は O(1) です。
  • しかし、ハッシュ テーブルの重要なポイントの 1 つは、等しいかどうかを比較する必要があるが、より大きい、より小さいなどの条件は達成できないため、実際のクエリ状況に適合しないことです。

今のところ、MySQL インデックスの実装には AVL ツリーまたは赤黒ツリーのどちらか一方がより適しているようです。この 2 つのデータ構造の検索効率はツリーの高さによって直接決まります。したがって、データが増えるとツリーの高さも増えます。

さらに最適化するには、N 項検索ツリーを使用してツリーの高さを減らし、ディスク IO を減らして検索効率を向上させることができます。

Bツリー:

BツリーはN分探索木の一種である。

Bツリーの例の構造:

ここに画像の説明を挿入

インデックスで使用される各ノードはレコードを表す

Bツリーの特徴:

  • 各ノードにはN個のサブツリーが含まれる可能性がある
  • 各ノードには複数の値がある場合があります。
  • 左のサブツリーの値はすべてルートノードの対応する値よりも小さく、右のサブツリーの値はすべてルートノードの対応する値よりも大きい

B+ツリー:

B+ ツリーは、B ツリーの改良版である特殊な N 項検索ツリーです。

B+ツリーの例の構造:

ここに画像の説明を挿入

B ツリーに対する B+ ツリーの改良点:

  • リーフ ノードはレコードの各行を格納し、非リーフ ノードは各行のインデックス値のみを格納する必要があります。
  • 非リーフノードの値が繰り返され、リーフノード層が完全なデータセットになります。
  • すべてのリーフ ノードは、リンク リストと同様の方法で接続できます。

B+ツリーの利点:

  • 範囲検索が得意
  • すべてのクエリがリーフノードに届くため、クエリ速度は比較的安定しています。
  • リーフ ノードは完全なデータ セットであるため、リーフ ノードはハード ディスクに保存でき、非リーフ ノードはメモリに直接保存できるため、ハード ディスクの読み取り回数が大幅に削減されます。

1.4 適用可能なシナリオ

  • 検索回数は比較的多いですが、挿入や削除の回数は比較的少ないため、インデックスの使用に適しています。
  • インデックス自体も一定のスペースを占有するため、ディスク容量が不足している場合はインデックスの使用は適していません。
  • インデックスは列を指定して作成します。列の区別度合いが大きい場合は、自動インクリメントの主キーなどのインデックスを使用するのが適しています。

1.5 使用上の注意

補充:

primary key制約、一意制約、または外部キー制約を作成すると、対応する列のインデックスが自動的に作成されます。

1.5.1 インデックスを表示

文法:

テーブル名からインデックスを表示します。

例:

ここに画像の説明を挿入

1.5.2 インデックスの作成

文法:

テーブル名 (フィールド名) にインデックス インデックス名を作成します。

例:

ここに画像の説明を挿入

1.5.3 インデックスの削除

文法:

テーブル名のインデックス インデックス名を削除します。

例:

ここに画像の説明を挿入

知らせ:

プライマリ インデックスは削除できません。削除するとエラーが報告されます。

2. 取引

2.1 コンセプト

物事: コンピューターでは非常に広い概念であり、一般的には実行すべきことや実行したことを指します。リレーショナル データベースでは、トランザクションは SQL ステートメント、SQL ステートメントのグループ、またはプログラム全体になります。

簡単に言えば、たとえば銀行振込操作で、A が B に 500 元を送金すると、この操作には実際には 2 つの操作が含まれます。A の口座残高は 500 元減少し、B の口座残高は 500 元増加します。

物事は、この一連のアクションを 1 つにまとめたもの、つまり何もしないかすべてを行うかのいずれかに相当します。

2.2 トランザクションを使用する理由

上記の銀行振込の例を使用して、口座 A から 500 元を減額する操作は成功したが、口座 B から 500 元を増額する操作は成功しなかった場合、振込操作は失敗となります。

物事の核となる特性は、一連の操作をまとめて全体を形成することです。操作はすべて完了するか、まったく完了しないかのどちらかです。

何もしないということは、操作が失敗した場合、その時点の中間状態が秘密裏に復元されることを意味します。

したがって、物を使用することで、一連の操作が部分的にしか完了せず、完全に完了するか、まったく完了しないことを保証できます。

2.3 4つの主要な属性

トランザクションは、リカバリと同時実行制御の基本単位です。トランザクションには、原子性、一貫性、永続性、分離性の 4 つの特性があります

物事の核心は原子性である

2.3.1 原子性

コンセプト:

トランザクションは、分割できない作業単位です。トランザクションに含まれる操作は、すべて完了するか、まったく完了しないかのいずれかです。

物事の核心は原子性であり、原子性の核心は中間状態へのロールバックであり、中間状態へのロールバックの核心はロールバックであり、ロールバックの核心は操作の各ステップを記憶することです。

2.3.2 一貫性

コンセプト:

トランザクションは、データベースをある一貫した状態から別の一貫した状態に変更する必要があります。一貫性と原子性は密接に関連しています。

トランザクションの実行前と実行後、現在のテーブル内のデータは適切な状態にあります

2.3.3 永続性

コンセプト:

永続性とは、 permanenceがコミットされると、データベース内のデータに加えられた変更が永続的になることを意味します。その後の他の操作や障害は、これに何ら影響を与えないはずです。

トランザクション操作のデータはハードディスク上で直接操作され、ハードディスク上のデータは永続的です。

2.3.4 分離

コンセプト:

トランザクションの実行は他のトランザクションによって妨害されることはありません。つまり、トランザクション内で使用される操作とデータは他の同時トランザクションから分離されており、同時に実行されるトランザクションは互いに干渉できません。

2.4 使用法

開いたもの:

トランザクションを開始します。


複数のSQL文を実行する

ロールバックまたはコミット

-- ロールバック: 上記のすべての SQL ステートメントがロールバックに失敗したことを示します。

-- 送信: 上記のすべての SQL ステートメントが正常にコミットされたことを示します。

これで、MySQL データベースのインデックスとトランザクションに関するこの記事は終了です。MySQL のインデックスとトランザクションに関するより詳しい情報については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

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

<<:  CentOS7 で ethereum/Ethereum を最初からインストールする

>>:  HTMLがHikvisionカメラのリアルタイム監視機能を実現

推薦する

Echarts 凡例コンポーネントのプロパティとソース コード

凡例コンポーネントは、ECharts でよく使用されるコンポーネントです。シリーズ マーカーの名前を...

JavaScriptの基礎を学ぶ

目次1. JavaScriptを記述する場所2. JavaScriptでよく使われる入力文と出力文1...

タグのターゲットリンクを iframe に向ける方法

コードをコピーコードは次のとおりです。 <iframe id="myFrameId&...

Vue データ内のプロパティをランダムに変更すると、ビューは更新されますか?

インタビュアー: Vue のソースコードを読んだことはありますか?応募者:あります。インタビュアー:...

Javascript 仮想 DOM の詳細な説明

目次仮想DOMとは何ですか?なぜ仮想DOMが必要なのでしょうか?仮想 DOM はどのようにして実際の...

Nginx の負荷分散構成、ダウンタイム発生時の自動切り替えモード

厳密に言えば、nginx には負荷分散バックエンド ノードのヘルス チェック機能はありませんが、デフ...

クールな花火効果を実現するjs

この記事では、jsを使用してクールな花火効果を実現するための具体的なコードを参考までに共有します。具...

Vue3 の組み合わせ API における setup、ref、reactive の完全な使用方法

1. セットアップを始める次のコード関数を簡単に紹介します。 ref 関数を使用して変数の変更を監視...

Vueルータールーティングの詳細な説明

目次1. 基本的な使い方2. 注意すべき点3. マルチレベルルーティング(マルチレベルルーティング)...

体験したい17 404ページ

404 を避けるべきだとどうして言えるのでしょうか? その理由は、ほとんどの 404 ページが粗雑す...

Xshellの一般的な問題と関連する設定の詳細な説明

この記事では、Xshell と関連する構成の一般的な問題について説明します。この記事の構成は、主に ...

RR および RC 分離レベルでのインデックスとロックのテスト スクリプトのサンプル コード

基本概念現在の読み取りとスナップショットの読み取りMVCC では、読み取り操作はスナップショット読み...

7つのMySQL JOINタイプのまとめ

始める前に、これから紹介する JOIN タイプを示すために 2 つのテーブルを作成します。テーブルを...

Linuxカーネルとデバイスツリーのコンパイルと書き込みを分析する

目次1. 材料を準備する2. Linuxカーネルファイルをダウンロードする3. コンパイル4. TF...

海外のウェブページのカラーマッチング事例20選共有

この記事では、優れた Web ページのカラー マッチングの事例を 20 件集めて紹介します。これらの...