TL

ストレージエンジンの系統樹

InnoDB や RocksDB はどこから来たのか。主要ストレージエンジンを B+Tree 系と LSM 系の二大系統に分け、年代と分岐をたどると、性能特性の理由まで一気につながります。

応用ストレージエンジンB+TreeLSM-TreeInnoDBRocksDB最終更新: 2026-06-21
TL;DR要点だけ先に
  • 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 系出来事
1970sB-Tree / B+Tree 理論Bayer と McCreight が B-Tree を提唱
1995頃BerkeleyDB汎用の組み込み Key-Value ストア
2000sInnoDB(MySQL)クラスタ化 B+Tree + MVCC が普及
1996LSM-Tree 理論O'Neil らが LSM-Tree を論文化
2008Cassandra / HBaseBigtable 論文(2006)を源流に SSTable + コンパクションの実装が広まる
2011LevelDBGoogle が Leveled コンパクションを実装
2012WiredTiger(B+Tree/LSM)RocksDBRocksDB は LevelDB を SSD 向けに改造
2013Bw-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=btreetype=lsm を選べる設計で、MongoDB の既定は B+Tree 構成です。

WiredTiger の 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 は LevelDB の子孫」ではない

Cassandra や HBase も LSM 系ですが、LevelDB のフォークではありません。同じ LSM の発想(SSTable + コンパクション)を 独立に実装した兄弟です。系統樹では「同じ理論を親に持つ別系列」であって、コード上の派生関係(フォーク)とは区別が必要です。フォークかどうかを混同すると、設定パラメータの互換性などを誤解しやすくなります。

橋渡しの枝:Bw-tree

Bw-tree(2013, Microsoft Research)は、系統樹上で B+Tree 系と LSM 系を橋渡しする位置にあります。論理的には B+Tree(多分木・ソート済み・範囲検索可)でありながら、更新方式は LSM 的な追記を採るためです。

核心は二点です。

  1. デルタ更新(out-of-place): ページを直接書き換えず、「この更新を適用せよ」という小さな デルタレコードを追記し、デルタ連鎖の先頭をページとして見せる。一定数たまったら統合(コンソリデーション)する。発想は LSM のコンパクションに近い。
  2. マッピングテーブルによる 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 / RocksDBout-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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

ストレージエンジンB+TreeLSM-TreeInnoDBRocksDBストレージエンジンB+TreeLSM-Tree
参考: 公式情報