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

推薦する

CentOS SVN サーバーで複数のプロジェクトを管理する方法

一つの要求一般的に、企業には複数のプロジェクトがあります。SVN サーバーを設定した後は、プロジェク...

ARGB、RGB、RGBAの違いと紹介

ARGB は、アルファ (透明度) チャネルが追加された RGB カラー モードであり、32 ビット...

MySQL 8.0.12 クイックインストールチュートリアル

MySQL 8.0.12 のインストールには 2 日かかり、さまざまな問題が発生しました。以下にまと...

Ubuntu で G++ を使用して CPP ファイルをコンパイルする

g++ を使用して初めて cpp ファイルをコンパイルしたとき、未定義の参照エラーが報告されました。...

MySQL マスタースレーブレプリケーションのいくつかのレプリケーション方法の概要

非同期レプリケーションMySQL レプリケーションは、デフォルトでは非同期です。マスター スレーブ ...

1 つの記事で Apache Avro データを解析する

概要: この記事では、Avro データをシリアル化して生成し、FlinkSQL を使用して解析する方...

MySQLスレーブライブラリの復元の実践記録

状況の説明:今日、MySQL データベースのスレーブ ノード ホストにログインしたところ、/var/...

Nginx ドメイン名の書き換えとワイルドカードドメイン名の解決を設定する方法

この記事では、ドメイン名の書き換えとワイルドカードドメイン名の解決を行うための Nginx の設定方...

Zabbix の psk 暗号化と zabbix_get 値の組み合わせ

Zabbix バージョン 3.0 以降、Zabbix サーバー、Zabbix プロキシ、Zabbix...

DockerでRedisを使用するための詳細な手順

1. はじめにこの記事では、Docker を使用して Redis を探索する方法を説明します。 Do...

スネークゲームのウェブ版を実装するためのJavaScript

この記事では、ウェブページのスネークゲームを実装するためのJavaScriptの具体的なコードを参考...

ウェブページ印刷細線表+ページ印刷究極の戦略

最近、クライアントのために印刷していたとき、ページのヘッダーを印刷するのではなく、表の内容だけを印刷...

Vueスロットの詳細な説明

1. 機能: 親コンポーネントが子コンポーネントの指定された位置に HTML 構造を挿入できるように...

MySQL パフォーマンス最適化インデックス プッシュダウン

インデックス条件プッシュダウン (ICP) は MySQL 5.6 で導入され、クエリを最適化するた...

VSCode と SSH を使用したリモート開発

0. リモート開発が必要な理由組み込み Linux を開発する場合、便宜上、通常は Windows ...