B-Treeがメモリ内でどのように機能するかを知っています。実装は簡単です。ただし、現在完全に私を超えているのは、次のように、ディスク上で効果的に機能するデータレイアウトを見つける方法です。
誰かがディスクレベルでのBツリー構造のレイアウトについての洞察を提供できれば、私は非常に感謝しています。特に最後の箇条書きは私に多くの頭痛の種を与えます。本へのポインタもいただければ幸いですが、私が見たほとんどのデータベースの文献では、高レベルの構造(つまり、「これがメモリ内での実行方法」)のみを説明していますが、ディスクレイアウトの本質的な詳細はスキップしています。
UPDATE(Oracleインデックス内部のアーカイブバージョン): http://web.archive.org/web/20161221112438/http://www.toadworld.com/platforms/Oracle/w/wiki/11001.Oracle- b-tree-index-from-the-concept-to-internals
OLD(元のリンクはもう存在しません):Oracleインデックスの内部に関する情報: http://www.toadworld.com/platforms/Oracle/w/wiki/11001.Oracle-b-tree-index- from-the-concept-to-internals
ノート:
データベースは、Bツリーに基づいてインデックスを直接実装するのではなく、B +ツリーと呼ばれるバリアントに基づいてインデックスを実装します。ウィキペディアによると:
B +ツリーは、各ノードにキーのみが含まれ(キーと値のペアではない)、下部にリンクされたリーフで追加のレベルが追加されたBツリーと見なすことができます。
データベースは一般にブロック指向のストレージで動作し、b +ツリーはbツリーよりも適しています。
ブロックは固定サイズであり、値またはキーサイズの将来の変更に対応するためにいくらかの空きスペースが残されています。
ブロックは、リーフ(実際のデータを保持)またはブランチ(リーフノードへのポインターを保持)のいずれかになります。
ディスクへの書き込みを実装する方法をおもちゃのモデル(算術を簡略化するためのブロックサイズ10kの場合):
情報がビッグインデックスから読み取られる場合:次のようになります。
非常に大きなインデックスを複数のファイルに分割できる場合、ブロックのアドレスは(filename_id、address_relative_to_this_file)のようになります。
それを読んでくださいこれは間違いなく役立ちます http://www.geeksforgeeks.org/b-tree-set-1-introduction-2/