MySQL Innodb インデックス メカニズムの詳細な紹介

MySQL Innodb インデックス メカニズムの詳細な紹介

1. インデックスとは何ですか?

インデックスは、ストレージ エンジンがレコードをすばやく検索するために使用するデータ構造です。

2. インデックスにはどのようなデータ構造がありますか?

  • 順次検索構造: この検索効率は非常に低く、複雑さは O(n) です。データ量が多い場合、クエリの効率は非常に低くなります。
  • 順序付けられたデータ配置: バイナリ検索はハーフ検索とも呼ばれます。

一度比較すると、検索範囲が半分に減ります。 MySQL のデータは順序付けられたシーケンスではありません。

  • 二分探索木: 左のサブツリーのキー値は常に​​ルートのキー値よりも小さく、右のサブツリーのキー値は常に​​ルートのキー値よりも大きくなります。順序付きトラバーサルによって得られたシーケンスは順序付けられたシーケンスですが、バイナリ検索ツリーが適切に構築されていない場合は、順次検索と変わりません。

  • バランスのとれた二分木: 二分探索木のバランスをとる必要がある場合は、バランスのとれた二分木が導出されます。バランスのとれた二分木は、まず二分探索木の定義を満たす必要があり、次に、任意のノードの 2 つのサブツリー間の高さの最大差が 1 である必要があります。明らかに、上記のツリーはバランスの取れた二分木ではありません。バランスの取れた二分木の例は次のとおりです。

バランスのとれたバイナリ検索ツリーの時間計算量は O(logN) です。クエリ速度は確かに非常に高速ですが、バランスのとれたバイナリツリーを維持するためのコストも非常に高くなります。通常、挿入または更新後にバランスをとるには、1 回以上の左回転と右回転が必要です。

  • B ツリー: B ツリーとバランス バイナリ ツリーの違いは、B ツリーがマルチウェイ ツリー (バランス マルチウェイ検索ツリーとも呼ばれる) であることです。
  1. ルート ノードには少なくとも 2 つの子ノード (各ノードには昇順に配置された M-1 個のキーがあります) があり、他のノードには少なくとも M/2 個の子ノードがあります。
  2. リーフノードはすべて同じレイヤー上にあります。
  • B+ ツリー

B+ ツリーは B ツリーの変種であり、B ツリーとインデックス シーケンシャル アクセス メソッドから進化したものです (B ツリーは実際にはほとんど使用されません)。
B+ ツリーは、ディスクやその他の直接ストレージ補助デバイス用に設計されたバランス検索ツリーです。
B+ツリーでは、すべてのレコードノードがキー値の順序で同じレイヤーのリーフノードに配置され、リーフノードポインタによって接続されます。
すべてのクエリはリーフ ノードを見つける必要があり、クエリのパフォーマンスは安定しています。
すべてのリーフ ノードは、範囲クエリを容易にするために順序付けられたリンク リストを形成します。各リーフノードには隣接するリーフノードへのポインタが格納され、リーフノード自体はキーワードのサイズに応じて昇順にリンクされます(双方向リンクリスト)

3. Innodb がインデックスとして B+ ツリーを使用するのはなぜですか?

  1. システムは、ディスクのブロック読み取り特性を効果的に利用して、同じディスク ブロックを読み取りながらできるだけ多くのインデックス データをロードし、インデックス ヒット効率を向上させて、ディスク IO 読み取り回数を削減します (局所性原則とディスク事前読み取り)。
  2. B+ ツリーのディスク読み取りおよび書き込みコストは低くなります。B+ ツリーの内部ノードにはキーワードの特定の情報へのポインタがないため (リーフ ノードのみがそれを格納)、その内部ノードは B ツリーよりも小さくなります。同じ内部ノードのすべてのキーワードが同じディスク ブロックに格納されている場合、ディスク ブロックはより多くのキーワードを収容でき、メモリ内で一度に検索する必要があるキーワードが増えるため、相対的な IO 読み取りおよび書き込み時間が短縮されます。
  3. B+ツリーのクエリ効率はより安定しています。非終端点は、最終的にファイルの内容を指すノードではないため、リーフ ノード内のキーワードのインデックスにすぎません。したがって、キーワード検索では、ルート ノードからリーフ ノードへのパスをたどる必要があります。すべてのキーワード クエリのパスの長さは同じであるため、各データのクエリ効率は同等になります。
  4. B+ ツリーは範囲クエリをサポートしますが、B ツリーはサポートしません。

4. インデックス分類

ストレージ構造による分類: BTreeインデックス、ハッシュインデックス、フルテキストインデックス

アプリケーションからの分類: 主キーインデックス、ユニークインデックス、複合インデックス

物理ストレージの観点から:クラスター化インデックスと非クラスター化インデックス(補助インデックス)

クラスター化インデックスと非クラスター化インデックスとは何かについて説明します。

  • クラスター化インデックス

各テーブルの主キーに応じて B+ ツリーが構築され、テーブル全体の行レコードデータがリーフ ノードに格納されます。クラスター化インデックスのリーフ ノードはデータ ページとも呼ばれ、各データ ページは二重リンク リストを通じてリンクされます。

クラスター化インデックスは、主キーのソート検索や範囲検索に非常に高速です。

  • 補助索引

インデックス列の格納に加えて、リーフ ノードへのポインタも格納されます。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL Innodbの主な機能挿入バッファ
  • MySQL InnoDB ストレージエンジンのメモリ管理の詳細な説明
  • MySQL InnoDB ReplicaSet の簡単な紹介
  • MySQL InnoDB トランザクション ロック ソースコード分析
  • MySQLのInnoDBストレージエンジンにおけるさまざまなロックの詳細な説明
  • MySQL ストレージ エンジン InnoDB と MyISAM
  • MySQL の innoDB でファントム リードを解決する方法

<<:  閲覧時に作成されたWebページの下部にある余分な空白スペースを削除する方法

>>:  HTMLウェブページテーブル構造化マークアップの応用に関する簡単な説明

推薦する

Linux システムに docker をインストールし、ssh 経由で docker コンテナにログインする方法

注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...

Mysql が CPU を過剰に占有する場合の最適化方法 (必読)

Mysql が CPU を占有しすぎる場合、どこから最適化を開始すればよいでしょうか? CPU 使...

MySQL の主キーとトランザクションの詳細な説明

目次1. MySQLの主キーとテーブルフィールドに関するコメント1. 主キーと自動増分2. テーブル...

mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション

問題を見つける最近、仕事で問題が発生しました。InnoDB タイプの SQL ファイルを実行すると、...

nginx で第 3 レベルドメイン名を設定する方法の例

問題の説明nginx を設定することで、異なるポートを介して異なる Web アプリケーションにアクセ...

MySQL ページングクエリ最適化テクニック

ページング クエリを使用するアプリケーションでは、LIMIT と OFFSET を含むクエリが非常に...

ランダムな文字を生成する Java サンプルコード

サンプルコード: java.util.Random をインポートします。 java.util.UUI...

JavaScript は詳細なコードで星座クエリ機能を実装します

目次1. タイトル2. コード3. 結果IV. 結論1. タイトルテキスト ボックスに誕生日の値を入...

Vue コンポーネントでのアンチシェイクとスロットリングの使用例の分析

入力ボックスへのユーザー入力、ウィンドウのサイズ変更、スクロール、Intersection Obse...

Linux を使用して時間指定ファイルが占有するディスク容量を計算する方法

スケジュールされたタスク エディターを開きます。Cent は、デフォルトで vim を使用して直接開...

CSS における px、em、rem、%、vw、vh 単位の違いの詳細な説明

1.ピクセルpx はピクセルの略語で、画面解像度に対する相対的な長さの単位です。 2. えむ参照は親...

CentOS7 上で KVM 仮想化プラットフォームを構築する (3 つの方法)

KVM はカーネルベースの仮想マシンの略で、Linux をハイパーバイザーに変換する Linux ...

nginxでの共有メモリの使用に関する詳細な説明

nginx プロセス モデルでは、トラフィック統計、トラフィック制御、データ共有などのタスクを完了す...

HTML+CSS を使用して、画像の右上隅に削除の十字と画像削除ボタンを追加します。

記録として、将来使用される可能性があり、困っている友人も使用できます。 BBはもうやめて、まずはレン...

Docker インストール tomcat dubbo-admin インスタンス スキル

1. tomcatイメージをダウンロードする docker pull tomcat:8.5.29 2...