私はインデックス作成のために B+tree を研究しており、構造を覚えるだけでなく、それ以上のことを理解しようとしています。私が理解している限り、B ツリーの内部ノードは葉にインデックスを形成し、葉にはディスク上のデータが格納されている場所へのポインターが含まれています。正しい?
いいえ、インデックスは内部ノード (非リーフ) によって形成されます。実装に応じて、リーフにはキーと値のペアまたはキーと値のペアへのポインターのいずれかが含まれる場合があります。たとえば、データベース インデックスは後者を使用しますが、IOT (Index Organized Table) の場合は値がリーフにインライン化されます。これは主に、値がキーに対して非常に大きいかどうかに依存します。
では、ルックアップはどのように行われるのでしょうか。
ルート ノードが葉ではない一般的なケース (最初はそうです) では、ルート ノードには、N 個のキーと N+1 個のポインターの並べ替えられた配列が含まれます。2 つのキー S0 と S1 を二分検索するとS0 <= K < S1
(K は探しているものです)、次のノードへのポインターが得られます。
キーと値のペアの並べ替えられたリストを含むリーフ ノードに (最終的に) ヒットするまでプロセスを繰り返し、最後のバイナリ検索をそれらに渡します。
B+木が二分木よりはるかに優れているのなら、どこでも二分木の代わりに B+木を使用しないのはなぜですか?
- 二分木は実装が簡単です。B+Trees を使用した cookie の 1 つは、内部ノードのキー/ポインターの数と、葉ノードのキー/値のペアの数をサイズ設定することです。もう 1 つの Cookie は、2 つのノードのグループ化または 1 つのノードの爆発につながる最低水準点と最高水準点を決定することです。
- 二分木はメモリの安定性も提供します。挿入された要素はメモリ内でまったく移動しません。一方、B+Tree に要素を挿入したり削除したりすると、要素のシャッフルが発生する可能性があります。
- B+Tree は、キーが小さい/値が大きい場合に合わせて調整されています。また、キーを複製できることも必要です (できれば安価に)。
読み物へのリンクを教えていただけませんか?
私が説明した大まかなアルゴリズムがお役に立てば幸いです。それ以外の場合は、コメントでお気軽にお問い合わせください。
データベースのインデックス作成以外に、B+ ツリーにはどのような用途がありますか?
同様に、ファイル システムのインデックス作成にもメリットがあります。
アイデアは常に同じです。B+Tree は、小さなキー/大きな値とキャッシングで非常に優れています。アイデアは、すべてのキー (内部ノード) を高速メモリ (CPU キャッシュ >> RAM >> ディスク) に保持することであり、B+Tree はキーを一番下にプッシュすることで大規模なコレクションを実現します。すべての内部ノードが高速メモリ内にあるため、(値を取得するための) 検索ごとに低速メモリ アクセスが 1 回しかありません。