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ウェブページテーブル構造化マークアップの応用に関する簡単な説明

推薦する

Hadoop 2.x と 3.x の 22 ポイントの比較、Hadoop 3.x の 2.x に対する改善点

質問ガイド1. Hadoop 3.x はどのようにして障害を許容するのでしょうか? 2. Hadoo...

NodeはMySQLに接続し、追加、削除、変更、チェックのための実装コードをカプセル化します。

目次ノードはMysqlに接続しますMySQLモジュールをインストールするMySQLに接続するよく使わ...

Vue での ElementUI の使用に関する詳細な説明

ログイン + セッションストレージエフェクト表示ログインに成功すると、ユーザー ID がフロントエン...

MySQL 外部キー制約の例の説明

MySQL の外部キー制約は、2 つのテーブル間のリンクを確立するために使用されます。 1 つのテー...

HTML テーブル マークアップ チュートリアル (22): 行の境界線の色属性 BORDERCOLORLIGHT

行内では、明るい境界線の色を個別に定義できます。基本的な構文<TR ボーダーカラーライト=co...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

node.js の require メソッドの読み込みルールの詳細な説明

require メソッドの読み込みルールキャッシュからの読み込みを優先するコアモジュールパス形式のモ...

Node.js での SerialPort モジュールの使用

目次目的モジュールのインストール基本的な使い方ポートをスキャンする開いているポートデータの送信データ...

vue3 のさまざまなファイルタイプのプレビュー機能の例

目次序文1. オフィス文書の種類のプレビュー2. PDF形式のプレビュー3. 画像の種類4. ビデオ...

時系列転位修復ケースを実装するSQL

目次1. 要件の説明2. アイデアの概要1. 延長を要求する2. アイデアの概要3. SQLコード1...

LeetCode の SQL 実装 (178. スコアランキング)

[LeetCode] 178.ランクスコアスコアをランク付けする SQL クエリを記述します。2 ...

60件のページング事例と優れた実践例を推奨

<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...

Vue プロジェクトでブラウザ キャッシュ設定を無効にする例

プロジェクトをリリースするときに、キャッシュをクリーンアップする必要があるという問題に遭遇することが...

ウィンドウ内のさまざまな距離/スクロール距離の正確な計算の概要

通常、プロジェクト開発では、マージン、位置、座標などを扱う必要があります。悲劇なのは、これらの概念が...

Vue の echarts ツールチップにクリック イベントを追加する詳細な説明

目次必要回避策1. ツールチップを設定する2. hookToolTip変数を定義する3. メソッド内...