資料儲存 索引結構

2021-07-11 18:48:54 字數 2222 閱讀 3486

b樹是為磁碟儲存而專門設計的一類平衡搜尋樹,b樹的高度僅隨著它所包含的節點數按對數增長,不過因為單個節點可以包含多個關鍵字,所以對數的底數可以比較大,實際應用中一般是50~2000,給個直觀的數字,一棵分支因子為1001、高度為2(不包含根節點)的b樹,可以儲存超過10億個關鍵字!

計算機的機械磁碟,為了攤還機械移動花費的等待時間,磁碟會一次訪問多個資料項而不是乙個,這樣的一次讀取的資訊單元是page,我們可以用讀或寫的頁數作為磁碟訪問總時間的主要近似值,在任何時刻,b樹演算法都只需在記憶體中保持一定數量的頁面。b樹的設計考慮磁碟預讀取這點,乙個b樹的節點通常和乙個完整磁碟頁(page)一樣大,並且磁碟頁的大小限制了乙個b樹節點可以含有的孩子個數(分支因子),當然這個具體也需要取決於乙個關鍵字相對一頁的大小。b+ tree中內部節點只存放關鍵字和孩子的指標,不存其他satellite information,因此最大化了內部節點的分支因子。

搜尋一棵b樹和搜尋一棵二叉搜尋樹很相似,只是在每個節點所做的不是二叉或者「兩路」分支選擇,而是根據根節點的孩子數做多路分支選擇。

b樹插入的時候都是插入到葉節點上,插入的時候會從根節點開始順著葉節點的方向沿途,如果遇到乙個滿節點(該節點上的關鍵字達到2t-1,t代表t階b樹),就會split該節點,**節點方式就是把滿節點上的中間關鍵字往根節點方向提,**是樹長高的唯一途徑。b樹的每個葉節點具有相同的高度,所以b樹高度的增加發生在頂部而不是底部。插入節點的時候,從根的方向往下判斷,如果不是葉子節點,則必須選擇適當的葉子節點插入,因為在沿途已經**了節點,所以保證不會在滿節點上再插入節點。

和插入關鍵字類似,插入關鍵字的時候要保證節點不會太大,而且有可能會增高b樹。刪除節點的時候要保證乙個節點不會變得太小,因為b樹的節點上的關鍵字有下界要求(除了根節點以外的每個內部節點至少有t個孩子,如果樹非空,根節點上至少有乙個關鍵字),刪除關鍵字的時候如果在葉子節點,而且刪除之後還滿足b樹的要求,那直接刪除即可,不過如果是其他情況,比如在內部節點上刪除關鍵字,那就有一系列的演算法分支需要考慮,感興趣的讀者可以自行找資料慢慢琢磨了。不過在實際場景中,由於一棵b樹中大部分關鍵字都在葉節點中,刪除操作最經常是從葉子節點中刪除關鍵字。

mysql的myisam和innodb兩個儲存引擎的索引實現方式:

講lsm樹之前,需要提下三種基本的儲存引擎,這樣才能清楚lsm樹的由來:

通過以上的分析,應該知道lsm樹的由來了,lsm樹的設計思想非常樸素:將對資料的修改增量保持在記憶體中,達到指定的大小限制後將這些修改操作批量寫入磁碟,不過讀取的時候稍微麻煩,需要合併磁碟中歷史資料和記憶體中最近修改操作,所以寫入效能大大提公升,讀取時可能需要先看是否命中記憶體,否則需要訪問較多的磁碟檔案。極端的說,基於lsm樹實現的hbase的寫效能比mysql高了乙個數量級,讀效能低了乙個數量級。

lsm樹原理把一棵大樹拆分成n棵小樹,它首先寫入記憶體中,隨著小樹越來越大,記憶體中的小樹會flush到磁碟中,磁碟中的樹定期可以做merge操作,合併成一棵大樹,以優化讀效能。

以上這些大概就是hbase儲存的設計主要思想,這裡分別對應說明下:

關於lsm tree,對於最簡單的二層lsm tree而言,記憶體中的資料和磁碟你中的資料merge操作,如下圖

圖來自lsm**

lsm tree,理論上,可以是記憶體中樹的一部分和磁碟中第一層樹做merge,對於磁碟中的樹直接做update操作有可能會破壞物理block的連續性,但是實際應用中,一般lsm有多層,當磁碟中的小樹合併成乙個大樹的時候,可以重新排好順序,使得block連續,優化讀效能。

hbase在實現中,是把整個內存在一定閾值後,flush到disk中,形成乙個file,這個file的儲存也就是乙個小的b+樹,因為hbase一般是部署在hdfs上,hdfs不支援對檔案的update操作,所以hbase這麼整體記憶體flush,而不是和磁碟中的小樹merge update,這個設計也就能講通了。記憶體flush到磁碟上的小樹,定期也會合併成乙個大樹。整體上hbase就是用了lsm tree的思路。

索引的儲存結構

下面是本人畫的一張關於資料頁和索引儲存結構圖 此圖中,最上部分是資料頁的儲存結構。下半部分是表中有索引,這裡就出現了b tree結構,索引的根級會引用索引的下一級,直到索引的最後一級,這一級引用的物件是rid 當表中不存在聚集索引時,rid會指向每一行資料儲存位置,rid的字段長度為16位元組 或聚...

mysql的索引儲存資料結構

我們mysql底層的索引儲存資料結構是按照b 樹方式來儲存的,也是從b樹結構演變而來。我們知道索引就是類似我們的書本的目錄頁,儲存要找的內容所在的頁數。b樹的結構 葉節點具有相同的深度,葉節點的指標為空 所有索引元素不重複 節點中的資料索引從左到右遞增排列 b 樹的結構 非葉子節點不儲存data,只...

索引儲存結構和分塊 索引 查詢

索引儲存結構 索引儲存結構 資料表 索引表 索引表 index blocked table 中的每一項稱為索引項,索引項的一般形式 關鍵字,位址 舉個例子 分塊查詢的基本思想 分塊查詢又稱分塊索引查詢 index blocked search 是一種介於順序查詢和二分查詢之間的查詢方法。其基本思想是...