MySQLインデックスの基礎となるデータ構造の詳細

MySQLインデックスの基礎となるデータ構造の詳細

1. インデックスの種類

1. B+ツリー

なぜ B ツリーではなく B+ ツリーなのでしょうか?

まず、B ツリーと B+ ツリーの構造上の違いを見てみましょう。

Bツリー構造:

B+ツリー:

以下が見られます:

  • B ツリーでは各ノードにサテライト データ (データ テーブル内のデータ行) がありますが、B+ ツリーではリーフ ノードにのみサテライト データがあります。これは、同じサイズのディスクセクターの場合、B+ツリーはより多くのリーフノードを格納でき、必要なディスクIO時間が短くなることを意味します。また、B+ツリーの検索効率はより安定しており、Bツリーデータクエリの最速の時間計算量はO(1)であることを意味します。
  • B ツリーの各ノードは 1 回だけ表示され、B+ ツリーのすべてのノードはリーフ ノードに表示されます。 B+ ツリーのすべてのリーフ ノードは昇順のリンク リストを形成します。これは間隔範囲の検索に適していますが、B ツリーは適していません。

2. MyISAM と InnoDB の B+ ツリー インデックス実装 (クラスター化インデックスと非クラスター化インデックス) の違いは何ですか?

まず、クラスター化インデックスと非クラスター化インデックスを理解する必要があります。

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

クラスター化インデックスでは、リーフ ページに行のすべてのデータが含まれ、ノード ページにはインデックス列が含まれます。 InnoDB は主キーによってデータをクラスター化します。主キーが定義されていない場合は、代わりに一意の空でないインデックス列が選択されます。そのようなインデックスがない場合、InnoDB は暗黙的に主キーをクラスター化インデックスとして定義します。

クラスター化インデックスのデータ分布:

クラスター化インデックスには、主キー インデックスに加えて、セカンダリ インデックスもあります。セカンダリ インデックスのリーフ ノードには、「行ポインタ」ではなく、行への「ポインタ」として使用される主キー値が格納されます。つまり、セカンダリ インデックスを通じて行を検索する場合、ストレージ エンジンはセカンダリ インデックスのリーフ ノードを見つけて対応するプライマリ キー値を取得し、この値に基づいてクラスター化インデックス内の対応する行を検索する必要があります。これは、「テーブルに戻る」とも呼ばれます。もちろん、カバーリング インデックスやInnoDBのアダプティブ インデックスを使用してテーブルの繰り返しを回避し、このような繰り返し作業を減らすこともできます。

: クラスター化インデックスの各リーフ ノードには、完全なデータ行だけでなく、トランザクション ID、トランザクションのロールバック ポインター、および MVCC も含まれます。

3. 非クラスター化インデックス

非クラスター化インデックスの主キー インデックスとセカンダリ インデックスは構造に違いはなく、どちらもリーフ ノード上のデータの物理アドレスを指す「行ポインター」を格納します。

クラスター化インデックスの主キー インデックスとセカンダリ インデックス:

非クラスター化インデックスの主キー インデックスとセカンダリ インデックス:

4. クラスター化インデックスの利点と欠点

アドバンテージ:

関連データをまとめて保存します(たとえば、すべてのユーザーのメールをユーザーIDごとにグループ化します)。そうしないと、各データの読み取りでディスクIOが発生する可能性があります。
データ アクセスが高速化します。インデックスとデータを同じ B+ ツリーに格納します。通常、クラスター化インデックスからデータを取得する方が、非クラスター化インデックスからデータを取得するよりも高速です。カバーリング クエリを使用すると、ページ ノードの主キー値を直接使用できます。

欠点:

すべてのデータをメモリに格納できる場合、シーケンシャル アクセスは不要になり、クラスター化インデックスの利点はなくなります。挿入速度は挿入順序によって異なります。ランダム挿入はページ分割やページ ホールの原因になります。OPTIMIZE TABLE を使用してテーブルを再構築します。挿入、更新、削除のたびにインデックス変更のメンテナンスが必要になり、コストが非常に高くなります。参照行の主キー列がノードに含まれるため、セカンダリ インデックスが予想よりも大きくなる場合があります。

5. ハッシュインデックス

ハッシュ インデックスはハッシュ テーブルに基づいて実装されます。インデックスのすべての列と完全に一致するクエリのみが有効であるため、ハッシュ インデックスは等価値クエリに適しています。

具体的な実装:データの各行について、ストレージ エンジンはすべてのインデックス列のハッシュ コードを計算します。ハッシュ インデックスはすべてのハッシュ コードをインデックスに格納し、各データ行へのポインターをハッシュ テーブルに保存します。

MySQL では、 Memoryエンジンは B ツリー インデックスもサポートしていますが、ハッシュ インデックスを明示的にサポートしているのはMemoryエンジンだけです。

注:メモリ エンジンは、一意でないハッシュ インデックスをサポートします。競合を解決するには、同じハッシュ値を持つ複数のレコード ポインターをリンク リストの形式で保存します。

6. 適応ハッシュインデックス

InnoDB 、特定のインデックス値が非常に頻繁に使用されていることに気付くと、メモリ内に B+ ツリー インデックスに基づくハッシュ インデックスを作成します。これにより、B+ ツリー インデックスにも、高速なハッシュ検索など、ハッシュ インデックスのいくつかの利点が備わります。

MySQL インデックスの基礎となるデータ構造の詳細に関するこの記事はこれで終わりです。MySQL インデックスの基礎となるデータ構造の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQLでテーブルインデックスを構築する方法
  • MySQL のインデックスとデータ テーブルを管理する方法
  • MySQLデータベースインデックスの詳細な紹介
  • MySQLデータベースインデックスの詳細な説明
  • MySQL データの最適化 - 多層インデックス
  • MySQL データベースのインデックスとトランザクション
  • MySQLテーブルのインデックス作成の原理の詳細な説明

<<:  HttpsページでBaiduシェアを使用するためのソリューション

>>: 

推薦する

MySQL の隠し列の詳細表示

目次1. 主キーが存在する2. 主キーはないが、一意のインデックスが存在する3. 共同主キーまたは共...

実稼働環境でのNginx高可用性ソリューションの実装プロセスの分析

準備: 192.168.16.128 192.168.16.129 2 台の仮想マシン。 Nginx...

MySQL 8.0.15 のダウンロードとインストールの詳細なチュートリアルは初心者にとって必須です。

この記事では、MySQL 8.0.15をダウンロードしてインストールするための具体的な手順を参考まで...

JDKネイティブスレッドプールのバグを修正するTomcatの実装原理

処理能力と同時実行性を向上させるために、Web コンテナは通常、リクエストを処理するタスクをスレッド...

HTML で色を表すには、6 桁の 16 進コード、RGB、またはキーワードを使用します。

HTML で色を表す方法は 3 つありますが、最もよく使われるのは 6 桁の 16 進コード表現です...

Nginx は rtmp ライブ サーバーの実装コードを構築します

1. nginxソースディレクトリに新しいrtmpディレクトリを作成し、git clone http...

CentOS/RHEL システムで VLAN タグ付きイーサネット カードを使用する方法

シナリオによっては、Linux サーバー (CentOS/RHEL) の同じイーサネット カード (...

ウェブページのエクスペリエンス: ウェブページのカラーマッチング

<br />ウェブページの色はウェブサイトのイメージを確立する鍵の一つですが、ネットユー...

mysql 5.7.5 m15 winx64.zip インストール チュートリアル

win7 64 ビットで mysql-5.7.5-m15-winx64 をインストールして構成する方...

MySQLは間違ったパスワードを入力する試行回数を制御します

1. 本番環境でMySQLのデッドロックを監視し、デッドロックの可能性を減らす方法まず、デッドロック...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

vscodeで保存した後のHTML自動フォーマットの問題を解決する

vsCode のバージョンは最近更新され、現在のバージョン番号は 1.43 です。実際、vsCode...

HTML チュートリアル、HTML デフォルト スタイル

html 、アドレス、引用、本文、 dd 、 div 、 dl 、 dt 、フィールドセット、フォ...

ブラウザが登録できるイベントの概要

HTML イベント リスト一般イベント: onClick HTML: マウスクリックイベント。主にオ...

CSSインジェクションの知識の要約

最近のブラウザでは、CSS 内で JavaScript を実行することはできなくなりました。以前は、...