ストレージエンジンの系統樹
InnoDB や RocksDB はどこから来たのか。主要ストレージエンジンを B+Tree 系と LSM 系の二大系統に分け、年代と分岐をたどると、性能特性の理由まで一気につながります。
- 1.ストレージエンジンは更新を直接書き換える B+Tree 系(InnoDB・WiredTiger・Bw-tree)と、追記してから畳む LSM 系(LevelDB・RocksDB)の二大系統に大別できる。
- 2.LSM 系の主流は 2010 年の LevelDB が起点で、Facebook が SSD 向けに改造した RocksDB が事実上の標準ライブラリ。MongoDB の WiredTiger は B+Tree と LSM の両方を実装した折衷型。
- 3.Bw-tree はページを直接書き換えずデルタ追記で更新する Latch-Free な B+Tree で、B+Tree 系と LSM 系の発想を橋渡しする。系統の違いは書き込み増幅と読み取り増幅のトレードオフに帰着する。
二大系統という見取り図
データベースの「ストレージエンジン」とは、行やキーバリューを実際にディスクへ配置し、読み書きする最下層のコンポーネントです。一見すると InnoDB・RocksDB・WiredTiger・LevelDB・Bw-tree と無関係な固有名詞が並んでいるように見えますが、内部の更新方式で見ると B+Tree 系と LSM 系という二つの系統にきれいに分かれます。
分岐の根は、更新をどう扱うかという一点です。
- B+Tree 系: 対象ページを探して その場で書き換える(in-place update)。ソート済みの木をたどるので読み取りが安定して速い。
- LSM 系: 更新を 追記して、後でまとめて畳む(out-of-place update)。ランダム書き込みをシーケンシャル化するので書き込みに強い。
この対立軸そのものは B+Tree インデックスの内部構造 と LSM-Tree とログ構造化ストレージ で詳説しています。本稿はその上に立ち、どのエンジンがどの系統から、いつ、なぜ分岐したかを系統樹として整理します。
系統樹の全体像(年代と系統)
主要エンジンを発祥年とともに二本の幹に振り分けて並べると、分岐の構図がはっきり見えます。
| 年代 | B+Tree 系 | LSM 系 | 出来事 |
|---|---|---|---|
| 1970s | B-Tree / B+Tree 理論 | — | Bayer と McCreight が B-Tree を提唱 |
| 1995頃 | BerkeleyDB | — | 汎用の組み込み Key-Value ストア |
| 2000s | InnoDB(MySQL) | — | クラスタ化 B+Tree + MVCC が普及 |
| 1996 | — | LSM-Tree 理論 | O'Neil らが LSM-Tree を論文化 |
| 2008 | — | Cassandra / HBase | Bigtable 論文(2006)を源流に SSTable + コンパクションの実装が広まる |
| 2011 | — | LevelDB | Google が Leveled コンパクションを実装 |
| 2012 | WiredTiger(B+Tree/LSM) | RocksDB | RocksDB は LevelDB を SSD 向けに改造 |
| 2013 | Bw-tree(論文) | — | Latch-Free な B+Tree を Microsoft が提案 |
左右に分けて並べていますが、両系統は別物として競合しているのではなく、同じ「ディスクへの永続化」という課題に対する二通りの答えです。LevelDB(2011)が LSM 系の現代的な起点で、RocksDB(2012)はその直接の派生です。WiredTiger は両系統を一つのエンジンに同居させた折衷です。
B+Tree 系の幹:InnoDB と WiredTiger
B+Tree 系の起源は 1970 年代の B-Tree 理論で、データを葉に集約した B+Tree が索引の標準になりました。理論の詳細は B+Tree インデックスの内部構造 に譲り、ここでは実装系統の分岐を見ます。
InnoDB(MySQL の既定エンジン)
InnoDB の最大の特徴は クラスタ化インデックスです。表データそのものが主キーの B+Tree の葉に格納され、行が主キー順に物理配置されます。これにより主キー範囲検索は葉リンクをたどる順次読みになりますが、副次インデックスは「主キー値」を指すため、二段階の探索(副次索引 → 主キー索引)が必要になります。
InnoDB は B+Tree に MVCC(多版型同時実行制御) を組み合わせ、更新時に旧版を Undo ログへ退避します。in-place 更新でも読み取りが版を見られるのはこのためです。
WiredTiger(MongoDB の既定エンジン)
WiredTiger は系統樹の中で特異な存在で、B+Tree と LSM の両方をエンジン内に実装しています。テーブル作成時に type=btree か type=lsm を選べる設計で、MongoDB の既定は B+Tree 構成です。
WiredTiger の B+Tree は、ディスク上のページとメモリ上のページを分離し、更新を即座にページへ書き戻さず メモリ上のスキップリスト(更新リスト)に溜める設計を採ります。チェックポイント時にまとめてディスクへ書くため、純粋な in-place 更新よりも書き込みがまとまり、後述する Bw-tree のデルタ追記に発想が近い面があります。これが「B+Tree 系の幹にいながら LSM 的な工夫を取り込んだ折衷」と呼ばれる理由です。
LSM 系の幹:LevelDB から RocksDB へ
LSM 系の理論的起点は O'Neil らの 1996 年の論文ですが、実用上の系統樹の根は **LevelDB(2011, Google)**です。Bigtable で培われた SSTable + コンパクションの考え方を、単体の組み込みライブラリとして結晶化させました。構造の基礎(MemTable・SSTable・WAL・コンパクション)は LSM-Tree とログ構造化ストレージ で扱っています。
LevelDB → RocksDB の分岐
RocksDB(2012, Facebook)は LevelDB の **フォーク(直接の派生)**です。HDD 時代に設計された LevelDB を、SSD と高並列・大容量のサーバー環境向けに作り直したものです。主な変更点を整理します。
| 観点 | LevelDB(親) | RocksDB(派生) |
|---|---|---|
| 想定ハード | 単一ディスク・小規模 | SSD・マルチコア・大容量 |
| コンパクション | Leveled のみ | Leveled / Universal を選択可 |
| 並列性 | コンパクションは単スレッド | マルチスレッドコンパクション |
| 拡張性 | 機能が固定的 | カラムファミリ・プラグイン・統計が豊富 |
| 利用形態 | 組み込みライブラリ | 他 DB のストレージ層として広く再利用 |
RocksDB は単体の DB ではなく ストレージエンジンのライブラリとして設計されたため、MySQL(MyRocks)・CockroachDB・TiDB・Kafka Streams など多数のシステムが内部に組み込み、LSM 系の事実上の標準実装になりました。系統樹で言えば、LevelDB が根、RocksDB が太い幹、その先に各 DB の採用が枝として広がる形です。
LSM 系の系統(簡略)
LSM-Tree 理論(1996)
│
Bigtable / SSTable の実装(2000s)
│
LevelDB(2011, Google)
│ フォーク
RocksDB(2012, Facebook)
├─ MyRocks(MySQL のエンジン差し替え)
├─ CockroachDB / TiDB(分散 DB の下層)
└─ Kafka Streams ほか
Cassandra や HBase も LSM 系ですが、LevelDB のフォークではありません。同じ LSM の発想(SSTable + コンパクション)を 独立に実装した兄弟です。系統樹では「同じ理論を親に持つ別系列」であって、コード上の派生関係(フォーク)とは区別が必要です。フォークかどうかを混同すると、設定パラメータの互換性などを誤解しやすくなります。
橋渡しの枝:Bw-tree
Bw-tree(2013, Microsoft Research)は、系統樹上で B+Tree 系と LSM 系を橋渡しする位置にあります。論理的には B+Tree(多分木・ソート済み・範囲検索可)でありながら、更新方式は LSM 的な追記を採るためです。
核心は二点です。
- デルタ更新(out-of-place): ページを直接書き換えず、「この更新を適用せよ」という小さな デルタレコードを追記し、デルタ連鎖の先頭をページとして見せる。一定数たまったら統合(コンソリデーション)する。発想は LSM のコンパクションに近い。
- マッピングテーブルによる Latch-Free: ページを物理アドレスでなく 論理ページ ID で参照し、ID から実体への対応表を **CAS(Compare-And-Swap)**で原子的に差し替える。これによりロック(ラッチ)なしで更新でき、マルチコアでスケールする。
通常の B+Tree: ページを探す → その場で書き換える(要ラッチ)
Bw-tree : ページを探す → デルタを先頭に追記し、
マッピングテーブルのポインタを CAS で差し替え(ラッチ不要)
Δ(挿入) → Δ(削除) → ... → ベースページ
つまり Bw-tree は「B+Tree の論理構造」に「LSM 的な追記更新」と「Latch-Free 並行制御」を載せたハイブリッドです。SQL Server の Hekaton(インメモリ OLTP)で採用され、ロック競合を避けたい高並列ワークロードに向きます。
系統を貫く一本の軸:増幅トレードオフ
なぜ系統が二つに分かれたのか。最終的には 書き込み増幅・読み取り増幅・空間増幅のトレードオフ(RUM)に行き着きます。in-place 更新は読み取りを安定させる代わりに書き込みがランダムになり、out-of-place 更新は書き込みをシーケンシャル化する代わりに読み取りと空間で増幅を払う、という非対称性です。
| 系統 | 代表エンジン | 更新方式 | 強み | 代償 |
|---|---|---|---|---|
| B+Tree 系 | InnoDB / WiredTiger(btree) | in-place(その場更新) | 点・範囲読み取りが安定 | ランダム書き込み・ページ分割 |
| LSM 系 | LevelDB / RocksDB | out-of-place(追記+コンパクション) | 書き込みスループット | 読み取り増幅・空間増幅 |
| 折衷 / 橋渡し | WiredTiger(lsm) / Bw-tree | 追記寄り+論理 B+Tree | 並行性・書き込みの均し | 統合処理・実装の複雑さ |
この軸の選び方は、トランザクション処理が読み取り主体か書き込み主体かに依存し、RDB と NoSQL の使い分け の判断にも直結します。どの系統でも更新の永続性は ライトアヘッドログ(WAL) が支えており、WAL は系統を問わず共通の土台である点も押さえておきましょう。
二大系統= in-place の B+Tree 系(InnoDB・WiredTiger) と out-of-place の LSM 系(LevelDB・RocksDB)を即答できるように。RocksDB は LevelDB の SSD 向けフォークでストレージライブラリとして広く再利用される点、WiredTiger は B+Tree と LSM を両方持つ折衷、Bw-tree は デルタ追記+ Latch-Free な B+Tree という橋渡し、という対応がよく問われます。
まとめ
主要ストレージエンジンは、更新を その場で書き換える B+Tree 系(InnoDB・WiredTiger)と、追記して後で畳む LSM 系(LevelDB・RocksDB)の二大系統に整理できます。LSM 系の現代的な根は **LevelDB(2011)**で、SSD 向けフォークの **RocksDB(2012)**が事実上の標準ライブラリです。WiredTiger は両系統を同居させた折衷、Bw-tree は B+Tree の論理構造に LSM 的なデルタ追記と Latch-Free を載せた橋渡しです。系統の違いは結局 書き込み・読み取り・空間の増幅トレードオフに帰着し、ワークロードがどちらに寄るかでエンジンの系統を選ぶのが原則です。
データベース Article
ストレージエンジンの系統樹を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ストレージエンジン
比較で見る軸
難易度: advanced / カテゴリ: データベース / タグ数: 5
導入後に効く点
LSM 系の主流は 2010 年の LevelDB が起点で、Facebook が SSD 向けに改造した RocksDB が事実上の標準ライブラリ。MongoDB の WiredTiger は B+Tree と LSM の両方を実装した折衷型。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- データベース
- タグ数
- 5
判断チェックリスト
- 自社の用途が「ストレージエンジン / B+Tree」に近いか確認する。
- 強みである「ストレージエンジンは更新を直接書き換える B+Tree 系(InnoDB・WiredTiger・Bw-tree)と、追記してから畳む LSM 系(LevelDB・RocksDB)の二大系統に大別できる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。