[譯]從磁盤結構到B+樹

本篇文章來自Youtube上的一個視頻,以爲講得相對不錯。連接以下:www.youtube.com/watch?v=aZj…數據庫

目錄

  1. disk 結構
  2. disk是如何存儲數據的
  3. 什麼是索引
  4. 什麼是多級索引
  5. m-way搜索樹
  6. B樹:m-way搜索樹 + 規則
  7. B樹中的插入操做
  8. B+樹

disk結構

簡單來講:按照時鐘方向分,disk由不少個sector組成,編號爲0-N。按照從外到內分,disk又由多個track組成,編號爲0-N。sector和track交叉的地方,叫作block,每一個block有本身的address,能夠用(track_no,sector_no)表示。每一個block的大小是同樣的,具體的大小要看實際狀況,在這裏,咱們假設一個block的大小是512bytes。數組

須要十分明確的一點是:不管是讀操做,仍是寫操做,都是以block爲單位進行的。微信

在block內部,能夠看做是一個數組結構,座標從0到511。每一個byte都有一個address,這個稱爲offset。因此咱們能夠把disk上的每個byte用(track_no,sector_no,offset)的形式表示。數據結構

在計算機中,disk的結構能夠這麼簡要地表示。dom

其中有一個讀寫頭,每一個時刻,讀寫頭對準了disk上的其中一個block(track_no,sector_no)。經過旋轉,能夠改變sector_no,經過伸縮讀寫頭,能夠改變track_no。性能

還有一點,也是須要明確的:**只有disk上的數據被加載到RAM(random access memory),才能被程序使用。**或者說,纔是真正對程序有用的。優化

如何優化RAM中數據的效率,這門學問叫作數據結構;如何優化disk中數據的效率,這門學問叫作DBMS,也就是大部分數據庫所要研究的內容。3d

disk是如何存儲數據(特值定數據庫數據)的

如今有一個employee table,其中有這些字段,每一個字段的大小如圖所示,一個record的大小總計爲128 bytes。指針

總共有100行數據:cdn

每一個block能夠存4行數據。存這100條數據,須要25個block。若是如今咱們須要查詢其中的一條數據,最多就須要查詢25個block。

什麼是索引

咱們建一個簡單的索引,有兩個字段,一個eid,表示employee的id,還有一個字段pointer,指向數據存儲在disk上的位置。empolyee中的每一行,在index上都有一條記錄。

那麼咱們又是怎麼存儲這個索引的呢?這裏咱們假設仍是所有存在disk上(固然你徹底能夠選擇直接存在內存裏)。那麼這個索引須要佔據多少個block呢?eid大小爲10bytes,pointer大小爲6bytes,因此一行索引就有16個bytes大小。100條索引就須要佔據100 * 16 / 512 -> 4個block。

那麼如今要查詢employee表中的某一條數據,最多須要查詢多少個block呢?答案是4+1=5個。效率比以前要高了不少。

什麼是多級索引

如今假設有1000條數據,這1000條數據將佔據250個block,上一小節講的索引將佔據40個block。如今用索引查詢一次,最多須要41次block access。如今這個索引已經不能知足咱們對性能的追求了,那麼能不能對索引建一個索引呢?也就是二級索引?

對於二級索引,不須要記錄每條employee在disk的位置,只須要記錄一級索引全部block的位置就好了。 因此,二級索引須要40條記錄,也就是須要佔據2個block的空間。這種二級索引能夠叫作稀疏索引,他不會包含全部數據行所在的位置。

如今藉助二級索引,查詢效率爲:2 + 1 + 1 = 4次block access。

隨着數據量不斷增長,還能夠對二級索引創建三級索引,對三級索引創建四級索引……

同時,咱們還但願作到一點:多級索引能夠隨着數據量的大小變化而自動建立和刪除。 這就引出了主角:B樹和B+樹。

m-way搜索樹

二叉搜索樹:每一個節點有一個值,有兩個子節點。

由二叉搜索樹擴展,讓每一個節點最多能夠存m-1個索引值,每一個節點能夠有m個子節點,就是m-way搜索樹。

上圖所示的就是3-way搜索樹。

下面的這個4-way搜索樹,每一個節點最多存了3個索引值,有4個指向子節點的pointer,同時還有指向數據項所在的位置的指針Rp。

咱們能夠用這個m-way搜索樹做爲數據庫的索引,可是,m-way搜索樹存在一些問題:

好比如今有三個數據:10,20,30,要用一個10-way搜索樹來構建。頗有可能,最終會構建出一個這樣的樹:

這是最糟糕的一種狀況,最終。咱們須要先把每一個節點填滿,而後才能建立下一個子節點。而m-way搜索樹自己,並無這種強制,你能夠隨意插入。

B樹:m-way搜索樹 + 規則

B樹,實際上能夠看做是m-way搜索樹 + 規則(如何構建這棵樹的規則)。

規則:

  • 每一個節點至少有[m/2]個子節點
  • 根節點能夠最少有2個子節點
  • 全部的葉子節點必須在一個層級
  • 建立過程是由下往上的

B樹中的插入操做

值:10,20,40,50。要構建一個4-way搜索樹。4-way搜索樹,意味着一個節點最多能夠有3個值。

這實際上,也就構建了一個二級索引。上面的是第二層索引,下面的是第一層索引。每一層構成了一級索引。

繼續插入60和70:

接着插入80,右下的那個節點已經沒有空位置了,因此須要新建一個節點,而後把70那個值提高到上一層。

插入30:

插入35:

等等等等:

每一個值旁邊,都有一個指向數據存儲位置的指針。

B+樹

在B+樹中,不是每一個值旁邊都有一個指向數據存儲位置的指針,只有葉子節點纔有。非葉子節點的值,在葉子節點上有他的副本。如圖所示:

這就成爲了一個密集索引。

關注個人微信公衆號

相關文章
相關標籤/搜索