この記事は mysql の高度な研究であり、mysql がインデックス データ構造として B ツリーを使用する理由を紹介しています。
インデックスによりクエリの効率が向上します。私たちが読んでいる本と同じように、特定の章に直接進みたい場合、ページごとにめくる必要はありません。目次を参照して、そのページが記載されているページ番号を見つけるだけです。 [関連する推奨事項: mysql ビデオ チュートリアル ]
コンピューターでは、このディレクトリを保存するためのデータ構造が必要です。一般的なデータ構造には、ハッシュ テーブル、二分探索ツリー、二分残高が含まれます。ツリー ( AVL)、赤黒ツリー、では、Innodb と MyISAM が b ツリーを選択する理由。
ハッシュ テーブルは、データの場所を示す添え字 0、1、2、3.... を持つ配列リンク リストです。データをハッシュ テーブルに保存する場合は、まずデータに対してハッシュ アルゴリズムを使用します (基本的なものはモジュロ演算です)。配列の長さが 13 の場合、モジュロ 13 の後は 0 ~ 12 になります。これは、次の値に対応します。計算された添字が同じ場合、リンク リストは添字の位置に続きます。
欠点:
#mysql がハッシュ テーブルを使用しないとは直接言えませんが、ストレージ エンジンに基づいて判断する必要があります。メモリ ストレージ エンジンはハッシュ テーブルを使用します
2. 二分探索木 欠点:ツリーのバランスを維持し、データの偏りを避けるためには、回転操作が必要です。左または右の回転によって、最も長いサブツリーと最も短いサブツリーの長さは 1 を超えることはできません。1 を超える場合は、欠点: 1. データ量が多い場合、バランスを維持するため、1 ~ n 回の回転が必要です。この回転は比較です。パフォーマンスの無駄です。挿入と削除の効率は非常に低く、クエリの効率は非常に高くなります。
最長のサブツリーは最短のサブツリーの 2 倍を超えることはできません。色の変更と回転により、挿入とクエリのバランスがとられます欠点: 分岐が 2 つしかないため、データ量が多い場合でも深さが非常に深くなります赤黒ツリーは avl ツリーの変形であり、挿入パフォーマンスを向上させるためにクエリ パフォーマンスの一部が失われます。
上記 3 つのバイナリ ツリーは、データが増加すると最終的にノードが多くなり、分岐が 2 つしかないため、IO の数も多くなります。 #解決方法 ブランチが 2 つしかなく、深さが深すぎるため、B ツリーがあり、ブランチを追加します
5. B-Tree
まず、B-subtract ツリーを読み取るのではなく、B-tree を読み取ります。
- すべてのキー値はツリー全体に分散されます。
- 検索は非リーフ ノードで終了する場合があり、キーワードの完全なセット内で検索が実行され、パフォーマンスは二分検索に近くなります。
- 各ノードには最大 m 個のサブツリーがあります。
- ルート ノードには少なくとも 2 つのサブツリーがあります。
- ブランチ ノードには少なくとも m/2 のサブツリーがあります (ルート ノードとリーフ ノードを除くすべてのブランチ ノード)。
- すべてのリーフ ノードは同じレイヤー上にあり、各ノードは最大 m-1 個のキーを持つことができ、昇順に配置されます。
上の図のように (図の一部のみが描画されています。実際には、p1、p2、p3 だけでなく、制限はありません)
各ノードは 1 つのディスク ブロックを占有します。ノード上に昇順に配置された 2 つのキーワードと、サブツリーのルート ノードへの 3 つのポインタがあります。ポインタには、子ノードが配置されているディスク ブロック アドレスが格納されます。 2つのキーワードで分割された3つの範囲フィールドは、3つのポインタが指すサブツリーのデータの範囲フィールドに対応する。ルートノードを例にとると、キーワードは 16 と 34 です。p1 ポインタが指すサブツリーのデータ範囲は 16 未満、p2 ポインタが指すサブツリーのデータ範囲は 16 ~ 34、データはp3 ポインタが指すサブツリーの範囲は 34 より大きいです。
キーワード 28 を見つけるプロセス:
欠点:
#上に示すように: B ツリー上には 2 つのヘッド ポインタがあり、1 つはルート ノードを指し、もう 1 つはキーワードの最小リーフ ノードを指します。また、すべてのリーフ ノード (およびデータ ノード) の間にチェーン リング構造があるため、2 つのヘッド ポインタが存在します。 B ツリーには 3 つの検索操作があります。1 つは主キーの範囲検索とページング検索で、もう 1 つはルート ノードから開始するランダム検索です。 InnoDB と MyISAM のインデックスの違い1. InnoDB の主キー インデックスリーフ ノードには特定の行データが格納されますB-tree は B-tree に基づいた最適化であり、変更点は次のとおりです:
- B ツリーの各ノードにはさらに多くのノードを含めることができます。これには 2 つの理由があります。1 つ目の理由は、ツリーの高さを減らすためです。2 つ目は、データ範囲を複数の間隔に変換するためです。間隔が増えるほど、データをより簡単に、より速く取得できます。
- 非リーフ ノードはキーのみを保存し、リーフ ノードはキーとデータを保存します。
- リーフ ノードのポインタは (ディスク先読みの特性に従って) 相互に接続されており、シーケンシャル クエリのパフォーマンスが高くなります。
2. InnoDB-非主キー インデックス非主キー インデックスのリーフ ノードには主キー値が格納されます (したがって、クエリ データは基本的にテーブルに返される必要があります)
3. MyISAMリーフ ノードは行データのアドレスを格納するため、追加のアドレス指定と 1 つ以上の IO
が必要です。
要約: mysql が B-tree を使用する理由正確な記述: mysql の InnoDB および MyISAM ストレージ エンジンのインデックスが B-tree を使用する理由
ハッシュ テーブル、等価クエリは非常に高速ですが、一般的な範囲検索を満たしておらず、隣接する 2 つの値の間に関係がなく、ハッシュはより多くのメモリを消費します。
二分木/バランス二分木/赤黒木などはすべて枝を 2 つだけ持ち、木の深さが 2 つしかないという共通点があります。データ量が多い場合はより深く、IO数を増やします。
B ツリーはノードにデータを格納するため、1 ページに格納されるキーの数が減り、ツリーの深さが増加します。
B ツリー内の非リーフ ノードのデータが削除されているため、ページ上のキーの数が増加し、リーフ ノードはリンクを通じて接続されています。範囲検索やページングに便利です。
プログラミング ビデオプログラミング関連の知識について詳しくは、
著者: Jiさん
以上がmysql インデックスが B+ ツリー構造を使用する理由について詳しく話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。