什么是B+樹呢?在說B+樹之前我們先了解一下為什么要有B樹,其實這些樹最開始都是為了解決某種系統中,查詢效率低的問題。B樹其實最開始源於的是二叉樹,二叉樹是只有左右孩子的樹,當數據量越大的時候,二叉樹的節點越多,那么當從根節點搜索的時候,影響查詢效率。所以如果這些節點存儲在外存儲器中的話,每訪問一個節點,相當於進行了一次I/O操作。
這里面說下外存儲器和內存儲器:
外存儲器:就是將數據存儲到磁盤中,每次查找的某個元素的時候都要取磁盤中查找,然后再寫入內存中,容量大,但是查詢效率低。
內存儲器:就是將數據放在內存中,查詢快,但是容量小。
我們大致了解了B樹和什么是外存儲器,內存儲器,那么就知道其實B+樹就是為了解決數據量大的時候存儲在外存儲器時候,查找效率低的問題。接下來就說下B+樹的特點:
- 中間元素不存數據,只是當索引用,所有數據都保存在葉子結點中。
- 所有的中間節點在子節點中要么是最大的元素要么是最小的元素 。
- 葉子結點包含所有的數據,和指向這些元素的指針,而且葉子結點的元素形成了自小向大這樣子的鏈表。
如下這個圖就很好的說明了B+的特點
看圖其實可以看到一個節點可以存放多個數據,查找一個節點的時候可以有多個元素,大大提升查找效率,這就是為什么數據庫索引用的就是B+樹,因為索引很大,不可能都放在內存中,所以通常是以索引文件的形式放在磁盤上,所以當查找數據的時候就會有磁盤I/O的消耗,而B+樹正可以解決這種問題,減少與磁盤的交互,因為進行一次I/O操作可以得到很多數據,增大查找數據的命中率。
這就可以很明顯的看出B+樹的優勢:
- 單個節點可以存儲更多的數據,減少I/O的次數。
- 查找性能更穩定,因為都是要查找到葉子結點。
- 葉子結點形成了有序鏈表,便於查詢。
B+樹是怎么進行查找的呢,分為單元素查找和范圍查找
單元素查找是從根一直查找到葉子結點,即使中間結點有這個元素也要查到葉子結點,因為中間結點只是索引,不存數據。比如要查元素3,如圖:
范圍查找是直接從鏈表查,比如要查元素3到元素8的,如圖:
也是參考了其他人的博客,自己也總結了一下,有說的不對的地方希望大家能夠多多指出,以后也會繼續努力噠,嘻嘻~