B 樹葉子節點資料如何儲存,以及如何查詢某一條資料

2022-10-11 08:03:10 字數 1204 閱讀 9556

mysql索引背後的資料結構及演算法原理

非常好根據一條sql  如何檢視索引結構等資訊?

聚簇索引

資料庫表中的資料都是儲存在頁裡的,那麼這乙個頁可以存放多少條記錄呢?

當然,查詢資料的時候,mysql也不能把所有的頁都遍歷一遍,所以就有了索引,innodb儲存引擎用b+樹的方式來構建索引。

聚簇索引就是按照每張表的主鍵構造一顆b+樹,葉子節點存放的是整行記錄資料,在非葉子節點上存放的是鍵值以及指向資料頁的指標,同時每個資料頁之間都通過乙個雙向鍊錶來進行鏈結。

如上圖所示,就是一顆聚簇索引樹的大致結構。它先將資料記錄按照主鍵排序,放在不同的頁中,下面一行是資料頁。上面的非葉子節點,存放主鍵值和乙個指向頁的指標。

當我們通過主鍵來查詢的時候,比如id=6的條件,就是通過這顆b+樹來查詢資料的過程。它先找到根頁面(page offset=3),然後通過二分查詢,定位到id=6的資料在指標為5的頁上。然後進一步的去page offset=5的頁面上載入資料。

在這裡,我們需要理解兩件事:

上圖中b+樹的根節點(page offset=3),是固定不會變化的。只要表建立了聚簇索引,它的根節點頁號就被記錄到某個地方了。還有一點,b+樹索引本身並不能直接找到具體的一條記錄,只能知道該記錄在哪個頁上,資料庫會把頁載入到記憶體,再通過二分查詢定位到具體的記錄。

現在我們知道了innodb儲存引擎最小儲存單元是頁,在b+樹索引結構裡,頁可以放一行一行的資料(葉子節點),也可以放主鍵+指標(非葉子節點)。

假如我們的主鍵id為bigint型別,長度為8位元組,而指標大小在innodb原始碼中設定為6位元組。這樣算下來就是 16384 / 14 = 1170,就是說乙個頁上可以存放1170個指標。

乙個指標指向乙個存放記錄的頁,乙個頁裡可以放16條資料,那麼一顆高度為2的b+樹就可以存放 1170 * 16=18720 條資料。同理,高度為3的b+樹,就可以存放 1170 * 1170 * 16 = 21902400 條記錄。

理論上就是這樣,在innodb儲存引擎中,b+樹的高度一般為2-4層,就可以滿足千萬級資料的儲存。查詢資料的時候,一次頁的查詢代表一次io,那我們通過主鍵索引查詢的時候,其實最多隻需要2-4次io就可以了。

輸出二叉樹葉子節點 葉子節點數目 二叉樹高度

include include 輸出二叉樹葉子節點 葉子節點數目 二叉樹高度 include typedef int datatype int count 0 用於統計葉子節點的數目 typedef struct node bitnode,bittree void creatbitree bittr...

NOJ 計算二叉樹葉子節點數目 西工大資料結構

今天晚上沒啥事,洗了洗澡,吃了點東西,又寫了一道,感覺和上一道比較類似。題目如下 分析一下題目,它是將乙個先序的一串資料整到二叉樹裡,再找出它的葉節點有幾個。輸入我決定採用遞迴的方法,每次讀入乙個資料,若是字母說明他是乙個根節點,若是 說明上個節點沒有當前分支,返回null即可。由此,ab 可轉換成...

資料結構 (二叉樹葉子節點構造單鏈表)

設計演算法,將給定二叉樹的葉子結點連成乙個帶頭結點的單鏈表,並要求葉子結點按照從左到右的順序插入,而排列順序為從右到左 逆置 的單鏈表。include include using namespace std define max 100 typedef char elemtype typedef s...