Database Internals: B+ Trees, LSM Engines, Write-Ahead Logs & MVCC
How storage engines find 1 row among 60 billion in 4 page hops, survive sudden power cuts without losing a cent, and let 10,000 queries run without blocking.
Every time you tap a payment card or filter a billion-row catalog in two milliseconds, a database engine quietly conquers two brutal hardware realities: NVMe SSDs read and write fixed 4–16 KB blocks rather than single bytes, and a sudden power failure mid-write can leave scattered disk pages half-updated and corrupt. To minimize slow storage hops on read-heavy workloads, relational engines organize data into wide, page-sized B+ Trees with branching factors near 500 — collapsing 62 billion rows into just 4 tree levels — while write-intensive engines use Log-Structured Merge (LSM) trees that turn random updates into blazing sequential appends. Underneath, an append-only Write-Ahead Log (WAL) guarantees crash-proof ACID durability, and Multi-Version Concurrency Control (MVCC) serves every concurrent user a clean, lock-free snapshot in time.
- 1.High-Fanout B+ Trees: Packing ~500 sorted key-pointer pairs into each 16 KB disk page yields log₅₀₀(N) height — pinpointing 1 record among 62.5 billion in 4 hops, with the top 3 directory levels cached in RAM so cold lookups cost just 1 SSD read!
- 2.LSM-Trees, SSTables & Bloom Filters: Write-heavy engines (RocksDB, Cassandra) buffer incoming mutations in a RAM MemTable, flush immutable Sorted String Tables (SSTables) sequentially to flash, and query bit-array Bloom filters to skip files guaranteed not to hold a key.
- 3.Write-Ahead Logging (WAL & ARIES): Before touching scattered data pages on disk, ACID transactions append compact redo/undo records sequentially to a WAL and fsync; after a crash, ARIES recovery replays committed changes and rolls back incomplete work.
- 4.MVCC Snapshots & Columnar OLAP vs. Row OLTP: Tagging immutable row versions with transaction IDs lets readers and writers run concurrently without blocking; row stores excel at transactional single-user lookups, while columnar engines (DuckDB, ClickHouse) crunch compressed columns via CPU SIMD vectors.
FIRST BIT — Trace How Hardware Bits & Binary Registers Build Memory Addressing
First-Principles Mechanism (Step by Step)
1. Why Storage Engines Use 500-Way B+ Trees Instead of Binary Trees
In an introductory algorithms class, a balanced binary search tree (like a Red-Black tree) looks optimal in RAM, needing log₂(10⁹) ≈ 30 pointer jumps to search a billion items. Put that binary tree on an SSD, however, and 30 random 4 KB page reads at ~80 microseconds each would crawl along at 2.4 milliseconds per lookup while wasting 99.5% of every fetched block! Rudolf Bayer and Edward McCreight invented the B-Tree (refined into the B+ Tree used by PostgreSQL, MySQL InnoDB, and SQLite) to match block storage geometry: every node IS a fixed 8 KB or 16 KB page packed with hundreds of sorted keys. In a B+ Tree, internal pages hold only routing keys while actual row payloads live exclusively in the bottom leaf level, linked sideways as a doubly linked list for effortless ordered range scans! With fanout 500, 3 internal levels occupy barely ~2 GB of RAM yet index 500³ × 500 = 62.5 billion leaf records, turning almost every cold lookup into a single NVMe fetch.
2. Taming Massive Write Streams: LSM-Trees, SSTables & Bloom Filters
B+ Trees pay a steep tax under relentless random writes: inserting a single 100-byte telemetry event into a random key requires reading, modifying, and eventually rewriting an entire 16 KB leaf page ('write amplification'), wearing out flash cells and bottlenecking IOPS. Patrick O'Neil's Log-Structured Merge (LSM) Tree — powering RocksDB, LevelDB, ScyllaDB, and Cassandra — flips the trade-off: incoming writes append to a sequential crash log and insert into a fast in-memory balanced tree ('MemTable'). Whenever the MemTable hits ~64 MB, it flushes sequentially to SSD as an immutable Sorted String Table (SSTable), and background compaction threads merge-sort overlapping SSTables across tiered levels (L0 → L1 → L2) like a continuous zipper, discarding overwritten or deleted ('tombstone') keys. To avoid checking ten SSTables on every read, each file carries a compact RAM bit-vector called a Bloom filter: hashing a queried key through k independent functions proves with 100% certainty when a file does NOT contain the key, saving 95%+ of pointless disk reads.
3. Crash-Proof ACID Durability: Write-Ahead Logging (WAL) & ARIES
Suppose Alice transfers $500 to Bob: Alice's row sits on page #412 and Bob's row sits on page #98,301. If the database writes Alice's -$500 page to SSD and lightning strikes the data center before Bob's +$500 page flushes, $500 vanishes into thin air; conversely, forcing random fsyncs of full 16 KB B+ Tree pages on every tiny commit would cripple throughput. C. Mohan's classic ARIES recovery architecture solves both via one ironclad rule: Write-Ahead Logging. Modifications happen fast on cached pages in RAM ('dirty pages'), while compact binary descriptions of each change (tagged with a monotonically increasing Log Sequence Number, LSN) append sequentially to the WAL file on disk. A transaction is officially committed the microsecond its sequential WAL commit record hits non-volatile storage! Upon reboot after a crash, ARIES runs three passes — Analysis, Redo (repeating history up to the crash), and Undo (walking backward through uncommitted transaction chains) — restoring 100% atomic consistency.
4. Lock-Free Time Travel (MVCC) & Row OLTP vs. Columnar OLAP
If a CFO runs a 15-second revenue sum across 50 million orders using naive read locks, either every customer checkout freezes for 15 seconds or the CFO gets a garbled half-old, half-new total! Modern engines implement Multi-Version Concurrency Control (MVCC): updating a row never overwrites bytes blindly in place; instead it creates a new version stamped with the writer's transaction ID (xmin / creation ID) while marking the old version superseded (xmax), cleaned up later by background garbage collection (VACUUM). Readers never block writers and writers never block readers — the CFO's query smoothly reads only versions committed before its snapshot timestamp! Finally, physical page layout splits databases into two worlds: transactional OLTP engines (PostgreSQL) pack entire rows [id, name, price, city] together so fetching one customer touches one cache line, whereas analytical OLAP engines (DuckDB, ClickHouse, Parquet) store millions of 'price' values contiguously in a single array — achieving 5–20× compression and letting CPU AVX-512 SIMD registers sum 8–16 numbers per clock cycle.
Common Myths vs. Verified Reality (Audited by SkepticJudge)
Why can a B+ Tree with a page branching factor (fanout) of 500 locate one specific row out of 10 billion records using only 1 actual SSD read in typical production operation?
Verified Primary Lectures & Sources (90+ Brain-Score)
Browse All 10,534 Sources →Understanding B-Trees: The Data Structure Behind Modern Databases
- • Multi-key B-tree nodes branch widely to keep trees shallow and minimize slow storage lookups in databases.
- • Balance invariants keep all leaves at equal depth and bound every node between half-full and maximum key capacity.
PostgreSQL Internals in Action: MVCC
- • PostgreSQL MVCC avoids overwriting rows in place, storing new tuple versions tagged with hidden xmin, xmax, and ctid columns.
- • Using pageinspect reveals ctid version chains and Heap-Only Tuple (HOT) flags that bypass index updates on unindexed changes.
The Secret Sauce Behind NoSQL: LSM Tree
- • LSM trees buffer writes in a sorted in-memory memtable and flush full batches to immutable SSTables via fast sequential disk I/O.
- • Updates append newer key entries and deletes write tombstone markers, while background compaction merges SSTables across levels.
Write-Ahead Logs. The secret to fast database queries.
- • Updating B+ tree nodes and multiple indexes directly on disk causes slow random I/O for every write query.
- • A write-ahead log (WAL) modifies pages in an in-memory buffer cache and commits changes via one sequential disk append.
Jede Kartenzahlung und jede Millisekunden-Suche in Milliarden Datensätzen meistert im Hintergrund zwei harte Hardware-Gesetze: SSDs adressieren keine einzelnen Bytes, sondern 4 bis 16 KB große Speicherseiten, und ein Stromausfall mitten im Schreibvorgang droht verstreute Datenblöcke halbfertig und korrupt zurückzulassen. Leseoptimierte Datenbanken packen Schlüssel deshalb in extrem breite, seitengenaue B+-Bäume mit Verzweigungsgraden um 500 — wodurch selbst 62 Milliarden Einträge nur 4 Baumebenen tief sind —, während schreibintensive Engines auf Log-Structured-Merge-Bäume (LSM) setzen, die zufällige Änderungen in rasante sequenzielle Schreibströme verwandeln. Darunter sichert ein sequenzielles Write-Ahead-Log (WAL) absolute Absturzsicherheit, und Multi-Version Concurrency Control (MVCC) gibt tausenden parallelen Nutzern konsistente Zeitscheiben ganz ohne Lesesperren.
- 1.Breite B+-Bäume (Hoher Fanout): Rund 500 sortierte Schlüssel pro 16-KB-Seite drücken die Baumhöhe auf log₅₀₀(N) — 62,5 Milliarden Zeilen brauchen nur 4 Ebenen, wovon die oberen 3 dauerhaft im RAM passen und ein Kaltzugriff nur 1 SSD-Lesevorgang kostet!
- 2.LSM-Bäume, SSTables & Bloom-Filter: Schreiboptimierte Systeme (RocksDB, Cassandra) sammeln Änderungen im RAM (MemTable), schreiben unveränderliche sortierte Dateien (SSTables) sequenziell auf SSD und prüfen per Bloom-Filter in Nanosekunden, ob ein Schlüssel in einer Datei überhaupt vorkommen kann.
- 3.Write-Ahead-Logging (WAL & ARIES): Vor dem Ändern verstreuter Datenseiten schreibt die Engine jeden Schritt sequenziell ins WAL auf Festspeicher; nach einem Stromausfall stellt das ARIES-Protokoll bestätigte Transaktionen exakt wieder her und macht abgebrochene rückgängig.
- 4.MVCC-Zeitscheiben & Zeilen- vs. Spaltenspeicher: Versionierte Tupel mit Transaktionsstempeln verhindern, dass Leser Schreiber blockieren; Zeilenspeicher (OLTP) holen ganze Kundensätze am Stück, während Spaltenspeicher (OLAP wie DuckDB/ClickHouse) einzelne Spalten hochkomprimiert per SIMD-Vektorbefehl aggregieren.
FIRST BIT — Verfolge den Aufbau digitaler Speicherlogik vom einzelnen Bit bis zum Registerwort
Wie es Schritt für Schritt wirklich funktioniert
1. Warum Datenbanken 500-Wege-B+-Bäume statt Binärbäume nutzen
Im Grundstudium wirkt ein balancierter Binärbaum (etwa ein Rot-Schwarz-Baum) ideal: Für eine Milliarde Einträge genügen log₂(10⁹) ≈ 30 Zeigersprünge. Auf einer SSD wären 30 zufällige Blockzugriffe jedoch viel zu langsam und würden pro 4-KB-Block über 99 % ungenutzte Nachbardaten mitladen! Rudolf Bayer und Edward McCreight entwarfen den B-Baum (heute meist als B+-Baum in PostgreSQL, MySQL InnoDB und SQLite) exakt passend zur Hardware-Blockgröße: Jeder Baumknoten entspricht genau einer 8- oder 16-KB-Speicherseite voller sortierter Schlüssel. Im B+-Baum enthalten innere Knoten nur schlanke Wegweiser, während die eigentlichen Nutzdaten ausschließlich in der untersten Blattebene liegen, die für schnelle Bereichsabfragen doppelt verkettet ist. Bei einem Verzweigungsgrad (Fanout) von 500 fassen bereits 4 Ebenen bis zu 500⁴ = 62,5 Milliarden Einträge — und da die oberen 3 Wegweiser-Ebenen komplett im Arbeitsspeicher (Buffer Pool) Platz finden, benötigt selbst eine Suche im Terabyte-Bestand oft nur einen einzigen SSD-Zugriff.
2. Gigantische Schreibströme bändigen: LSM-Bäume, SSTables & Bloom-Filter
Unter extremen Zufalls-Schreiblasten zahlen B+-Bäume einen hohen Preis: Schon das Einfügen einer winzigen 100-Byte-Messzeile an zufälliger Schlüsselposition zwingt zum Ändern und späteren Zurückschreiben einer kompletten 16-KB-Seite (‚Write Amplification‘). Der Log-Structured-Merge-Baum (LSM-Tree) hinter Systemen wie RocksDB, Cassandra oder ScyllaDB dreht den Spieß um: Neue Schreibvorgänge landen ohne jede Zufallssuche im sequenziellen Log und in einer sortierten Struktur im RAM (‚MemTable‘). Ist diese voll (z. B. 64 MB), wird sie an einem Stück sequenziell als unveränderliche Sorted String Table (SSTable) auf die SSD geschrieben, während Hintergrundprozesse ältere Dateien im Reißverschlussverfahren (Merge-Sort-Compaction) zusammenführen und veraltete Werte aussortieren. Damit Leseanfragen nicht dutzende SSTables einzeln durchsuchen müssen, besitzt jede Datei im RAM einen winzigen Bitvektor namens Bloom-Filter: Prüft man dort die Hash-Positionen eines gesuchten Schlüssels, schließt eine einzige Null mit 100 % Sicherheit aus, dass die Datei den Treffer enthält.
3. Absturzsichere ACID-Garantien: Write-Ahead-Logging (WAL) & ARIES
Angenommen, Alice überweist 500 € an Bob: Alices Kontostand liegt auf Speicherseite #412, Bobs auf Seite #98.301. Schreibt der Server Alices −500 € auf die SSD und genau in dieser Millisekunde fällt der Strom aus, bevor Bobs +500 € gespeichert sind, wären 500 € spurlos verschwunden; andererseits würde das sofortige Erzwingen zufälliger 16-KB-Seitenschreibvorgänge bei jedem Commit die Leistung ruinieren. C. Mohans berühmte ARIES-Architektur löst dieses Dilemma durch eine eiserne Regel: Write-Ahead-Logging (WAL). Seitenänderungen erfolgen pfeilschnell im RAM-Puffer, während kompakte Änderungsprotokolle mit fortlaufender Log Sequence Number (LSN) rein sequenziell an die WAL-Datei auf der SSD angehängt werden. Sobald der winzige Commit-Eintrag sequenziell per fsync im WAL gesichert ist, gilt die Transaktion garantiert als dauerhaft! Nach einem Absturz stellt die Engine den exakten Zustand in drei Phasen (Analyse, Redo aller protokollierten Schritte und rückwärtsgerichtetes Undo unfertiger Transaktionen) fehlerfrei wieder her.
4. Zeitreisen ohne Sperren (MVCC) & Zeilenspeicher gegen Spaltenspeicher
Würde eine 15 Sekunden laufende Bilanzabfrage über 50 Millionen Bestellungen klassische Lesesperren setzen, stünde der gesamte Online-Shop für 15 Sekunden still — und ohne Sperren entstünde ein inkonsistentes Gemisch aus alten und neuen Zahlen. Moderne Datenbanken nutzen deshalb Multi-Version Concurrency Control (MVCC): Ein Update überschreibt alte Bytes nicht sofort blind, sondern legt eine neue Zeilenversion mit eigener Start-Transaktionsnummer an und markiert die alte Version mit einer Ablaufnummer (die später ein Hintergrundprozess wie VACUUM aufräumt). So blockieren Leser niemals Schreiber und Schreiber niemals Leser — jede Abfrage sieht exakt den eingefrorenen Schnappschuss ihres Startzeitpunkts! Beim physischen Speicherlayout trennen sich schließlich zwei Welten: Transaktionssysteme (OLTP wie PostgreSQL) speichern komplette Zeilen hintereinander, um Einzelkunden sofort zu laden; Analysesysteme (OLAP wie DuckDB, ClickHouse oder Parquet) legen jede Tabellenspalte als eigenen dichten Zahlenblock ab — ideal für extreme Kompression und parallele CPU-SIMD-Vektorberechnungen.
Häufige Irrtümer vs. geprüfte Realität (SkepticJudge)
Warum findet ein B+-Baum mit einem Seiten-Verzweigungsgrad (Fanout) von 500 im laufenden Produktivbetrieb einen einzelnen Datensatz unter 10 Milliarden Zeilen meist mit nur einem einzigen echten SSD-Lesezugriff?
Geprüfte Primär-Vorträge im DeepScroll-Index
Alle 10.534 Quellen →Understanding B-Trees: The Data Structure Behind Modern Databases
- • B-Baum-Knoten mit mehreren Schlüsseln verzweigen breit, halten den Baum flach und sparen langsame Speicherzugriffe.
- • Alle Blätter liegen auf derselben Ebene, und jeder Knoten bleibt mindestens halb bis maximal vollständig gefüllt.
PostgreSQL Internals in Action: MVCC
- • PostgreSQL-MVCC überschreibt Zeilen nicht direkt, sondern legt neue Tupelversionen mit den Spalten xmin, xmax und ctid an.
- • Mit pageinspect werden ctid-Versionsketten und Heap-Only-Tuple-Flags (HOT) sichtbar, die unnötige Index-Updates ersparen.
The Secret Sauce Behind NoSQL: LSM Tree
- • LSM-Trees puffern Schreibvorgänge sortiert in einer Memtable im RAM und schreiben sie sequenziell als unveränderliche SSTables.
- • Updates hängen neue Einträge an und Löschungen schreiben Tombstones, während Hintergrund-Compaction SSTables über Ebenen merged.
Write-Ahead Logs. The secret to fast database queries.
- • Direktes Aktualisieren von B+-Baum-Knoten und mehreren Indizes auf der Festplatte erzeugt langsames zufälliges Disk-I/O.
- • Ein Write-Ahead-Log (WAL) ändert Seiten im RAM-Puffer und bestätigt Transaktionen mit nur einem sequenziellen Schreibvorgang.
Connected AI-Wiki Articles
Built with specialist AI agents, allied research bots & learner support to keep humanity's knowledge 100% ad-free forever.