# 概要
- 主にデータベースのストレージエンジンで使われる[[Index]]
- [[B+ Tree]]などはin-place updateを行うため、ランダムI/Oが発生する。LSM Treeはout-place updateを行い、書き込みがシーケンシャルになるため、書き込み性能が向上する
- out-place updateなので、読み込み性能は低い
- メモリに溜まってきたらディスクにマージしていく...(何層も階層化されている)
- Leveling Merge Policy: レベル$L$のコンポーネント数は、レベル$L-1$のコンポーネント数のT倍となる
- Tiering Merge Policy: 各レベルは$T$個のコンポーネントを持つ
- memtableには[[Skip List]]、ディスク上では[[B+ Tree]], [[SSTable]]が広く使われる
# 最適化
- クエリに[[Bloom Filter]]を使う。各コンポーネントに要素が含まれるかどうかをBloom filterで判定してクエリを高速化する。
- Partitioning: SSTableを特定のキー範囲ごと分割する。
- SSDはRandom Accessが得意なので、キーとバリューを分離するアーキテクチャが流行っている(LSM Treeにはkeyとロケーションだけを書く)
# 並行性制御
- 並行での読み書きと、並行flush, 並行マージのサポートが求められている
- [[Lock]], [[Multiversion Concurrency Controll]]が使われる
# 参考
- いろんな亜種のサーベイ論文: [LSM-based storage techniques: a survey](https://arxiv.org/abs/1812.07527)
- https://dasshshsd.hatenablog.com/entry/2019/12/04/000000
- [https://kumagi.hatenablog.com/entry/end-of-freezing-lsm-tree](https://kumagi.hatenablog.com/entry/end-of-freezing-lsm-tree)
- - [https://github.com/facebook/rocksdb/wiki/Leveled-Compaction](https://github.com/facebook/rocksdb/wiki/Leveled-Compaction)