有關甲骨文公司的指數內部的一些信息:http://www.toadworld.com/platforms/oracle/w/wiki/11001.oracle-b-tree-index-from-the-concept-to-internals
注:
數據庫都不能直接實現基於B樹,但在變異指標稱爲B +樹。其中根據維基百科:
A B +樹可以被看作是一個B-樹中,每個節點僅包含鍵(未鍵 - 值對),以及其中附加電平被添加在底部與鏈接樹葉。
數據庫的工作,一般來說,面向塊的存儲和b +樹更適合於這個b-tree。
塊是固定的大小,並留有一些可用空間,以適應未來價值或密鑰大小的變化。
A嵌段可以是葉(保持實際數據)或分支(保持指針的葉節點)
的玩具模型寫入到磁盤如何可以被實現(對於塊大小10K用於算術簡化):
- 10G的一個文件在磁盤上創建(它有塊1000)
- 第一塊指定爲根和下一個空閒酮作爲葉和葉片的地址的列表被放入根
- 插入的新數據,當前葉號解填充的值,直到達到閾值被
- 數據繼續被插入時,下一個自由的被分配爲葉塊和葉節點的列表被許多後更新
- 插入,當前根節點需要子節點,因此下一個空閒塊被分配爲分支節點,它將從根目錄複製列表,現在根將只維護一箇中間節點列表。
- 如果要分割節點塊的需要,下一個空閒塊被分配爲分支節點時,加入到根表和葉節點的列表被初始和新的分支節點
當之間分割信息是從一個大的索引讀:可以去以下:
- 讀出的第一/根塊(尋道(0),讀(10K)),其指向位於在塊900
- 讀的兒童塊900(尋找(900 * 10k),讀取(10K))哪個p向位於塊5000中的孩子提供子塊
- 讀取塊5000(搜索(5000 * 10k),讀取(10K)),其指向位於塊190中的葉節點
- 讀取塊190(搜索(190 * 10k ),讀(10K)),並提取感興趣的值從它
一個非常大的索引可以對多個文件進行分割,然後塊的地址將是東西爲(filename_id,address_relative_to_this_file)
感謝指向B +樹的指針。這是我實際打算做的,但基本原則應該非常相似。我知道塊的概念,它基本上只是一個容納N位數據的容器,可以一起讀取/寫入,其中N通常是硬盤磁盤讀取塊大小,以最大限度地減少磁盤訪問。 我的問題正是關於這個「適應未來變化的一些自由空間」。這在實踐中是如何完成的? – Alan47
閱讀文章,有很多與內部相關的信息 – valentin