一、定義
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