【Java】【資料庫】B樹
阿新 • • 發佈:2022-12-10
B-樹的形式
(B-樹就是B樹, 而且'-'是一個連線符號,不是減號。)
B樹的結構如下
不同於B+樹(關於B+樹,我的這篇部落格裡有寫:B+樹)的一些特點:
- 資料 \(K_i\) 左邊的樹不會將 \(K_i\) 包括在內,即如上圖第二層節點的G就不在它左邊指標指向的節點\([D,E,F]\)中。
- 搜尋有可能在非葉子節點結束,最好的情況下O(1)就能找到資料。
- 它的所有葉節點均為空,而B+樹的葉節點卻是一些\(<資料,指標>\)組成的。
- B+樹的葉節點有鏈指標,而B樹沒有。
- B樹的索引值和具體data都在每一個節點裡面,如下圖:
為什麼用B樹?紅黑樹,AVL樹不快嗎?
這些樹在一般情況下查詢效能非常好,但是資料量非常大的時候,記憶體不夠用,大部分資料只能存放在磁碟上,而訪問記憶體和外存的時間差了5個數量級,磁碟讀取時間遠超資料在記憶體中的比較時間,使得程式大部分時間會被阻塞在磁碟IO上。
這時候就迫切需要一種資料結構,它可以減少IO次數,B-樹就這樣被設計出來。
B+樹比B樹好在哪裡?
- B+樹的葉節點有鏈指標,可以很好的利用空間區域性性原理
(\(空間區域性性原理:如果一個儲存器某個位置被訪問,那麼它附近的位置也將會被訪問\)) - B+樹更適合外部儲存。因為內節點沒有data域,只有key的副本,所以每個節點能夠索引的範圍更大更精確,因為磁碟的IO資料大小是固定的,所以B+樹單次能IO更多的資訊量,相對B樹來說更能減少IO次數。