天天看點

mysql中lsm樹_LSM樹了解

對比三種引擎的實作:

hash存儲引擎:哈希表持久化的實作,可以快速支援增删改查等随機操作,且時間複雜度為o(1),但是不支援順序讀取掃描,對應的存儲系統為k-v存儲系統的實作。

b樹存儲引擎是b樹的持久化實作,不僅支援單條記錄的增删改查操作,還支援順序掃描,對應的存儲系統就是mysql。

lsm樹存儲引擎和b樹存儲引擎,一樣支援,增删改查,也支援順序掃描操作。LSM犧牲了讀性能,提高寫性能。

LSM的原理:将對資料的修改增量儲存在記憶體中,達到指定大小限制之後批量把資料flush到磁盤中,磁盤中樹定期可以做merge操作,合并成一棵大樹,以優化讀性能。不過讀取的時候稍微麻煩一些,讀取時看這些資料在記憶體中,如果未能命中記憶體,則需要通路較多的磁盤檔案。極端的說,基于LSM樹實作的hbase寫性能比mysql高了一個數量級,讀性能卻低了一個數量級。

LSM樹原理把一顆大叔拆分成N顆小樹,它首先在記憶體中,它首先寫入記憶體中,随着小樹越來越大,記憶體中的小樹會flush到磁盤中,磁盤中的樹定期可以做merge操作,合并成為一個大叔,用來優化讀性能。

mysql中lsm樹_LSM樹了解

以上就是hbase存儲設計的重要思想,這裡說明一下:

因為資料是先寫到記憶體中,是以為了防止記憶體資料丢失,會先把資料寫入hlog中,也符合了資料庫中标準,先寫日志,再寫資料

memstore上的樹達到一定大小之後,需要flush到磁盤中,然後再定期做合并,提高讀取的性能;

關于LSM Tree,對于最簡單的二層lsm而言。

mysql中lsm樹_LSM樹了解

lsm tree,理論上,可以是記憶體中樹的一部分和磁盤中一層數做merge,對于磁盤中的樹直接做update操作有可能會破壞實體block的連續性,在實際場景中,一般lsm有多層,當磁盤中的小樹合并成為一個大樹的時候,可以重新排好順序,使block連續,優化讀性能。

hbase在視線中,是把整個記憶體在一定門檻值後,flush到disk中,形成一個hfile檔案。這個file的存儲也是一個小的b+樹,因為hbase是存儲在hdfs上,hdfs不支援更新操作,是以hbase的資料也是定期flush到磁盤中,而不是和檔案中的hfile做合并操作。