MYSQL のインデックス構造で B ツリーではなく B+ ツリーが使用されるのはなぜですか?

序章

MYSQL のインデックス構造がなぜ B ツリーではなく B+ ツリーになっているのか (B-tree も B ツリーになる) という質問については、面接の過程でよく聞かれる質問かもしれないので、ここにまとめてブログに公開したいと思います。このブログの中で、面接でこの質問に遭遇した人は、うまく答えることができるでしょう。

B ツリーの定義

次数 mの B ツリーの場合、定義は次のようになります。

  • 各ノードには最大で m 個の子ノードがあります。
  • ルート ノードを除き、各非リーフ ノードには少なくとも m/2 (切り捨て) の子ノードがあります。
  • リーフ ノードではないルート ノードには、少なくとも 2 つの子ノードがあります。
  • k 個のサブツリーを持つ非リーフ ノードには k-1 個のキーがあり、キーは昇順に配置されます。
  • リーフ ノードはすべて同じレイヤーにあります。 

2 つの B+ ツリーの定義

次数 mの B+ ツリーの場合、定義は次のようになります。

  • 各ノードには最大で m 個の子ノードがあります。
  • ルート ノードを除き、各非リーフ ノードには少なくとも m/2 (切り捨て) の子ノードがあります。
  • リーフ ノードではないルート ノードには、少なくとも 2 つの子ノードがあります。
  • k 個のサブツリーを持つ非リーフ ノードには k 個のキーがあり、キーは昇順に配置されます。
  • リーフ ノードはすべて同じレイヤーにあり、リンク リストを介して接続されます(双方向または単方向の場合があります)。
  • 非リーフノードはデータを保存せず、インデックス値のみが保存され、すべてのデータはリーフノードによって保存されます
  • すべての中間ノード要素は、子ノード要素内で最大 (または最小) の要素である子ノードにも存在します。

B+ ツリーを使用する 3 つの理由

1.ノードはより多くのキーを保存できるため、最終的にツリーの高さが相対的に短くなり、クエリ中のハードディスク IO アクセスの数が減り、効率が向上します (ここでは B ツリーと B+ ツリーは同じです)。

2. B+ ツリーの非リーフ ノードはデータを保存せず、インデックスのみが保存されるため、B+ ツリーをストレージ構造として使用するデータの非リーフ ノードのスペースが大幅に削減されます。これにより、クエリも実行できます。同時に、ハードディスク上でクエリを実行する代わりに、これらのインデックスの一部またはすべてをメモリにロードできます。つまり、大量のハードディスク IO 操作をメモリ IO 操作に変換できます。 CPUによるメモリの読み出し速度は、ハードディスクからの読み出し速度に比べて数千倍以上速いため、アクセス速度が大幅に向上し、データベースの運用効率が向上します。

 データが 10 億個ある場合、整数 int をインデックスとして使用すると、インデックスは 4G 程度しかなく、ストレージ構造が B ツリーのような場合、10 億個のデータをロードするのは困難です。思い出を一気に。

3. MYSQL の範囲クエリは比較的一般的な操作であり、B+ ツリーのすべてのデータはリーフ ノードに格納され、 MYSQL の B+ ツリーのリーフ ノードは二重リンク リストで接続されているため、範囲クエリを実行するときに必要なのはする2 つのエンドポイントのノードをトラバースできます。つまり、 B+ ツリーは範囲クエリにおいて非常に効率的です。B ツリーが範囲クエリを実行したい場合は、この数を常にトラバースする必要があり、効率が大幅に向上します。 B+ ツリーよりも悪い。

4. データ取得に関しては、B+ ツリーのすべてのデータはリーフ ノードに格納されるため、B+ ツリー内のどのデータに対する IO 数も同じですが、逆に、B ツリーは不安定です。データを保存します ノードの深さは固定されていません(プログラムにとって安定性は非常に重要なので、この安定性を過小評価しないでください)

5. B+ ツリーのリーフ ノードにはすべてのデータが保存されるため、 B+ ツリーのグローバル スキャン機能はより強力です。これは、B+ ツリーではリーフ ノードをスキャンするだけで十分ですが、B ツリーはグローバル スキャンを実行するためにツリー全体を走査する必要があるためです。 。

4つのまとめ

一般に、技術的ソリューションの選択は、現在のシナリオにおける特定の問題を解決することです。必ずしもすべてのデータベースに当てはまるわけではありません。非リレーショナル データベースが主に B ツリーをストレージとして使用するのと同様に、B+ ツリーが最良の選択です。データの構造。 MYSQL などのリレーショナル データベースでは、B+ ツリーが使用されることがよくあります。

このブログがお役に立ちましたら、ブロガーさんへの「いいね!」や「収集」にご協力ください、よろしくお願いします!

おすすめ

転載: blog.csdn.net/m0_70322372/article/details/129786462