回答:
以下の画像は、B +ツリーとBツリーの違いを示しています。
B +ツリーの利点:
Bツリーの利点:
Bツリーに対するB +ツリーの主な利点は、データへのポインターを削除することで他のノードへのポインターをより多く詰め込むことができるため、ファンアウトが増加し、ツリーの深さが減少する可能性があることです。
欠点は、内部ノードで一致が見つかった可能性のある早期のアウトがないことです。ただし、どちらのデータ構造にもファンアウトが非常に多いため、一致の大部分はリーフノードで行われ、平均してB +ツリーがより効率的になります。
ターミナルノードはリンクリストを形成するため、B +ツリーは、ツリーがインデックス付けするすべてのデータを調べる場合と同様に、フルスキャンを実行する方がはるかに簡単でパフォーマンスが高くなります。Bツリーでフルスキャンを行うには、すべてのデータを見つけるためにフルツリートラバーサルを行う必要があります。
一方、Bツリーは、特にツリーがRAMまたはその他の非ブロックストレージにある場合に、シーク(キーで特定のデータの一部を探す)を行うと高速になります。ツリーでよく使用されるノードを昇格できるため、データにアクセスするために必要な比較が少なくなります。
Adegoke A、Amit
このセクションで説明するように、人々が見逃している重要な点の1つは、データとポインタの違いです。
ポインタ:他のノードへのポインタ。
データ:-データベースインデックスのコンテキストでは、データは別の場所にある実際のデータ(行)への単なるポインタです。
したがって、Bツリーの場合、各ノードには3つの情報キー、キーに関連付けられたデータへのポインター、および子ノードへのポインターがあります。
B +ツリーでは、内部ノードはキーと子ノードへのポインタを保持し、リーフノードはキーと関連データへのポインタを保持します。これにより、特定のサイズのノードでより多くのキーを使用できます。ノードのサイズは主にブロックサイズによって決まります。
ノードごとにより多くのキーを持つことの利点は上で十分に説明されているので、タイピングの労力を節約します。
B +ツリーは、ブロックベースのストレージ(例:ハードディスク)に特に適しています。これを念頭に置くと、たとえば(頭の上から)いくつかの利点が得られます。
高ファンアウト/低深度:つまり、データにアクセスするために必要なブロックを少なくする必要があります。ポインターとデータが混在していると、読み取りごとにポインターが少なくなるため、データに到達するためにシークを増やす必要があります。
シンプルで一貫性のあるブロックストレージ:内部ノードにはN個のポインターがあり、他には何もありません。リーフノードにはデータがあり、他にはありません。これにより、解析、デバッグ、再構築が簡単になります。
キー密度が高いということは、トップノードがほぼ確実にキャッシュ上にあることを意味します。多くの場合、すべての内部ノードがすばやくキャッシュされるため、データアクセスだけがディスクにアクセスする必要があります。
**
Bツリーの主な欠点は、キーを順番にたどることが難しいことです。B +ツリーは、Bツリーの高速ランダムアクセスプロパティを保持しながら、高速シーケンシャルアクセスも可能にします。
** ref:C //を使用したデータ構造著者:Aaro M Tenenbaum
一例を挙げましょう。行ごとに巨大なデータを持つテーブルがあります。つまり、オブジェクトのすべてのインスタンスはビッグです。
ここでBツリーを使用する場合、ほとんどの時間はデータのあるページのスキャンに費やされます-これは役に立たないものです。データベースでは、オブジェクトデータのスキャンを回避するためにB +ツリーを使用する理由です。
B +ツリーは、データからキーを分離します。
ただし、データサイズが小さい場合は、Bツリーと同じようにキーを使用して保存できます。
B-treeとB + treeの主な違いは、B-treeは検索キー値の冗長なストレージを排除することです。検索キーはB-treeで繰り返されないため、より少ないツリーノードを使用してインデックスを保存できない場合がありますただし、非リーフノードに表示される検索キーはBツリーの他の場所には表示されないため、非リーフノードの各検索キーに追加のポインターフィールドを含める必要があります。繰り返しが発生せず、大きなインデックスに使用できるため、これらはBツリーのスペース上の利点です。
B + treeは、ツリーのルートからリーフまでのすべてのパスが同じ長さであり、ツリーの各非リーフノードが[n / 2]から[n]までの子を持つバランスの取れたツリーです。nは特定の木のために修正されました。インデックスページとデータページが含まれています。バイナリツリーには、親ノードごとに2つの子しかありません。B+ツリーには、親ノードごとに可変数の子を含めることができます
B +ツリーの1つの可能な用途は、ツリーが非常に大きくなり、使用可能なメモリに収まらない状況に適していることです。したがって、通常は複数のI / Oを実行することになります。
実際にはメモリに収まる場合でもB +ツリーが使用され、キャッシュマネージャがそれを永続的に保持することがよくあります。ただし、これは一般的なケースではなく特殊なケースであり、キャッシュポリシーはB +ツリーのメンテナンスとは別のものです。
また、B +ツリーでは、リーフページがリンクリスト(または二重リンクリスト)でリンクされ、トラバーサル(範囲検索、並べ替えなど)が最適化されます。したがって、ポインターの数は、使用される特定のアルゴリズムの関数です。