天天看點

10分鐘梳理關系資料庫基礎知識(三):B+樹

每天10分鐘,用去食堂吃飯的時間解決一個知識點。

上一篇《10分鐘梳理關系資料庫基礎知識(二):存儲結構》中有強調,我們優化的目标,是盡量減少磁盤 IO 的次數。B+樹這種資料結構就很适合這種場景。因為它高扇出,長得矮矮胖胖的,一層是一次IO。

為了直覺地展現效果,我們可以做一個簡單的估算。之前提到的塊(block),在 InnoDB 中被稱作頁(page),大小是可以設的,預設為16KB。假設一行記錄為100個 Byte,即每個塊中能存160行記錄。高度為4的 B+樹,可存放的記錄數就是:160×160×160×160=655360000行。而目前機械盤的IOPS一般在100~200,即使以100計算,4次IO意味着時間隻需要0.04秒。是不是很美好?

當然這隻是一個粗略的估算,大家感受下B+樹存在的意義就好。

B+樹是B-樹的一個變種。與B-樹主要有兩個值得一提的不同,一是為了存放更多的指針,B+樹在非葉子節點中隻存放key,葉子節點中才有資料;二是葉子節點之間是有指針相聯系的,這就友善了範圍查詢。

為了讓大家有個更直覺的認識,我手工畫了一棵B+樹構造的過程:

10分鐘梳理關系資料庫基礎知識(三):B+樹

上圖做了簡化,沒有考慮填充因子(fill factor)。填充因子指的是葉子節點滿的程度,要求是在半滿和全滿之間,友善插入和删除。具體數值在InnoDB中是可以指定的,一般是75%,當然,要求至少半滿,是以可設的最小值是50%。