雜湊,二叉樹,紅黑樹,B樹,B+樹,LSM樹等資料結構做索引比較

劉狗發表於2020-10-08

 雜湊索引

雜湊索引:hash索引的隨機查詢的時間複雜度為O(1).可以一次定位。索引hash索引的查詢效率很高,但是弊端就是對於單個查詢比如等值查詢很方便。因為雜湊索引比較的就是就行hash運算後的hash值。但是如果是範圍查詢,雜湊過後的hash值和要查詢的範圍大部分情況下是不連續的,所以會慢。

 

二叉樹索引

二叉樹索引:二叉樹不適合做索引結構,二叉樹做索引結構樹的高度會越來越高,索引單邊增長。會導致查詢時間複雜度為O(n)。尤其是二叉樹不平衡的時候深度可達到N。則複雜度為O(n)。mysql每次查詢索引隨著高度增加,那麼查詢磁碟的次數就會越多。

 

紅黑樹索引

紅黑樹索引:紅黑樹也不適合做索引結構,因為紅黑樹的高度也是會隨著資料量越來越高。雖然查詢複雜度為O(logn)。但是比如mysql,每次查詢索引需要訪問磁碟,那麼隨著高度越高,查詢磁碟的次數就會越多,效能就會越差。其實紅黑樹在記憶體中要比B+樹效能要好,但是基於mysql,索引存在磁碟上,所以相比B+樹更好點

 

B樹索引

B樹索引:其實就是在索引的橫向上做了文章,讓每個節點可以儲存更多的索引。每個索引儲存著對應的資料磁碟指標。減少了樹的高度,也就減少了訪問磁碟的次數。對效能有所提高。

 

B+樹索引

B+樹索引:在B樹索引上進行了優化,也是減少了樹的高度,向橫向做文章,但是B+樹索引並不是所有的索引都儲存對應資料的磁碟指標。而是隻有葉子節點才會儲存對應的磁碟指標。而非葉子節點就會儲存更多的索引。葉子節點之間的索引之間也有指標關聯。為了方便範圍查詢。時間複雜度O(logN).

 

LSM樹索引

LSM樹索引:為了適應寫多讀少的場景,比如hbase. 分為記憶體部分和磁碟部分。記憶體資料結構可以選擇紅黑樹,跳躍表等來維護有序資料結構。這裡考慮併發效能,hbase選擇了跳躍表來維護有序的KV集合。hbase的flush操作也是通過兩個跳錶來刷到檔案中的。hbase為了彌補讀的效能。通過多路歸併,compact,布隆過濾器,BlockCahce來優化讀。

相關文章