數據結構-LSM樹


一、定義


LSM(Log Structured Merge Trees)日志結構合並樹。

 

其實不是一種樹,是一種思想

根B/B+樹一樣,常用於一些nosql數據庫的索引結構(如Hbase Cassandra SQLite)。

它的出現時為了解決B+樹 磁盤IO隨機讀取的效率問題。

LSM索引只做append 順序讀取,以提升磁盤IO效率

 

二、原理


把一棵大樹拆分成N棵小樹(B+樹),它首先寫入內存中,隨着小樹越來越大,內存中的小樹會flush到磁盤中,磁盤中的樹定期可以做merge操作,合並成一棵大樹,以優化讀性能。

LSM-Tree可以想象一份索引由兩棵樹組成:一個存在於內存(可以使用其他樹結構),一個存在於磁盤(如下圖)。

WAL

在設計數據庫的時候經常被使用,當插入一條數據時,數據先順序寫入 WAL 文件中,之后插入到內存中的 MemTable 中。

這樣就保證了數據的持久化,不會丟失數據,並且都是順序寫,速度很快。當程序掛掉重啟時,可以從 WAL 文件中重新恢復內存中的 MemTable。

如HBase的HLog

 

MemTable

MemTable 對應的就是 WAL 文件,是該文件內容在內存中的存儲結構。

Immutable Memtable

顧名思義,Immutable Memtable 就是在內存中只讀的 MemTable,由於內存是有限的,通常我們會設置一個閥值,

當 MemTable 占用的內存達到閥值后就自動轉換為 Immutable Memtable,Immutable Memtable 和 MemTable 的區別就是它是只讀的,系統此時會生成新的 MemTable 供寫操作繼續寫入。

之所以要使用 Immutable Memtable,就是為了避免將 MemTable 中的內容序列化到磁盤中時會阻塞寫操作。

SSTable

SSTable 就是 MemTable 中的數據在磁盤上的有序存儲。

 

合並

增刪改操作都是追加操作,會造成同一個key存在冗余數據,這些數據將通過合並操作(compact)優化。

 

三、索引常用結構


 

 

 

參考:

https://blog.csdn.net/gongpulin/article/details/81015440

https://www.cnblogs.com/swordfall/p/10567468.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM