MyRocks als InnoDB-Alternative: wann sich der LSM-Tree-Ansatz lohnt
AI generated
InnoDB
SQL
MySQL · Storage Engines · MyRocks · Skalierung
MyRocks als InnoDB-Alternative
wann sich der LSM-Tree-Ansatz wirklich lohnt

InnoDB speichert Daten als B-Tree und ist damit die Standardwahl für nahezu jede MySQL-Installation, auch bei Magento-Shops. Bei sehr hoher Schreiblast, etwa in Logging-Tabellen, Änderungsprotokollen oder Zeitreihendaten, stößt dieser Ansatz jedoch an Grenzen: Random Writes erzeugen Seiten-Splits und spürbare Write Amplification. MyRocks ersetzt den B-Tree durch einen Log-Structured-Merge-Tree, wie er aus RocksDB stammt, und verspricht dafür deutlich weniger Schreib-Overhead und kleinere Tabellen auf der Platte. Ob sich der Umstieg lohnt, hängt stark vom tatsächlichen Zugriffsmuster ab.

12 Min. Lesezeit MyRocks · RocksDB · LSM-Tree MySQL 8 · Percona Server · MariaDB-Plugin

1. Warum InnoDBs B-Tree-Architektur bei Schreiblast an Grenzen stößt

InnoDB speichert jeden Index, einschließlich des Primärschlüssels, als B+Tree. Jede Änderung an einer Zeile wird direkt in der passenden Seite des Baums vorgenommen, was bei sequentiellen Zugriffen sehr effizient ist. Bei zufälligen Schreibzugriffen auf große Tabellen führt dieses In-Place-Update-Modell jedoch regelmäßig zu Seiten-Splits, weil eine Seite voll wird und aufgeteilt werden muss, was zusätzliche I/O-Operationen und Fragmentierung erzeugt.

Kombiniert mit dem Redo Log und dem Doublewrite Buffer, die beide für Crash-Sicherheit sorgen, entsteht eine spürbare Write Amplification: Eine einzelne logische Zeilenänderung führt zu mehreren physischen Schreibvorgängen auf der Platte. Bei Workloads mit sehr hoher Einfügerate, etwa Ereignisprotokollen, Audit-Logs oder Zeitreihendaten mit Millionen Zeilen pro Tag, summiert sich dieser Overhead zu einem echten Engpass, selbst wenn die einzelnen Abfragen für sich genommen unproblematisch wären.

2. Das Grundprinzip des Log-Structured-Merge-Tree im Vergleich zum B-Tree

Ein LSM-Tree kehrt das Speicherprinzip um: Statt eine Zeile sofort an ihrer endgültigen Position zu aktualisieren, werden neue Schreibvorgänge zunächst in eine sortierte In-Memory-Struktur, die Memtable, angehängt. Erreicht diese Memtable eine bestimmte Größe, wird sie unverändert als sortierte, unveränderliche Datei, eine sogenannte SST-Datei, auf die Platte geschrieben. Änderungen an bereits geschriebenen Zeilen erzeugen also keine In-Place-Updates, sondern zusätzliche Einträge, die spätere Versionen überschreiben.

Im Hintergrund läuft ein Compaction-Prozess, der mehrere SST-Dateien zu größeren, wieder sortierten Dateien verschmilzt und dabei veraltete Versionen sowie gelöschte Zeilen entfernt. Sowohl das Schreiben der Memtable als auch die Compaction erfolgen sequentiell, was zufällige Schreibmuster der Anwendung in überwiegend sequentielle Plattenzugriffe umwandelt, während ein B-Tree bei denselben zufälligen Schreibzugriffen weiterhin zufällige Seitenzugriffe benötigt.

3. Wie MyRocks als Storage Engine in MySQL integriert ist

MyRocks entstand bei Facebook, dem heutigen Meta-Konzern, als Storage-Engine-Schicht über RocksDB, einer eingebetteten Key-Value-Bibliothek, die selbst wiederum von Googles LevelDB abstammt. RocksDB übernimmt dabei Memtable, SST-Dateien und Compaction, während MyRocks als Bindeglied das MySQL-Storage-Engine-API implementiert und relationale Tabellen samt Sekundärindizes auf das Key-Value-Modell von RocksDB abbildet.

Verfügbar ist MyRocks als ENGINE=ROCKSDB in Percona Server for MySQL standardmäßig als Plugin, in MariaDB als optionales, ladbares Plugin und lässt sich aus dem Quellcode auch für MySQL Community Server selbst bauen. Für Transaktionssicherheit über Binlog und RocksDB-eigenes Write-Ahead-Log hinweg nutzt MyRocks ein Zwei-Phasen-Commit-Verfahren, und Betriebsdaten stehen über die INFORMATION_SCHEMA.ROCKSDB_*-Tabellen zur Verfügung.

4. Schreiblast-Vorteile: geringere Write Amplification und sequentielle I/O

Weil Schreibvorgänge zunächst nur an die Memtable angehängt und erst später im Hintergrund kompaktiert werden, fällt die Write Amplification bei MyRocks im Vergleich zu InnoDB deutlich geringer aus, insbesondere bei Workloads mit sehr vielen kleinen, zufällig verteilten Inserts oder Updates. Benchmarks von Facebook und Percona zeigen bei schreiblastigen Workloads regelmäßig einen spürbar geringeren I/O-Durchsatz auf der Platte bei vergleichbarem Durchsatz auf Anwendungsebene.

Für Magento-Kontexte betrifft das vor allem Tabellen mit sehr hohem Insert-Volumen und seltenen punktuellen Lesezugriffen, etwa Changelog-Tabellen der Indexer, Admin-Aktionsprotokolle oder Kundenaktivitätslogs, bei denen Zeilen überwiegend geschrieben und selten einzeln wieder gezielt gelesen werden.


-- Tabelle für ein Änderungsprotokoll auf MyRocks anlegen
CREATE TABLE catalog_index_changelog_rocks (
    version_id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    entity_id  INT UNSIGNED NOT NULL,
    changed_at DATETIME NOT NULL,
    KEY idx_entity (entity_id),
    KEY idx_changed (changed_at)
) ENGINE=ROCKSDB DEFAULT CHARSET=utf8mb4;

-- Aktuelle Kompressionsraten je Storage-Engine vergleichen
SELECT engine, SUM(data_length) AS data_bytes, SUM(index_length) AS index_bytes
FROM information_schema.tables
WHERE table_schema = DATABASE()
GROUP BY engine;

5. Speicherplatzkompression: warum MyRocks-Tabellen oft deutlich kleiner sind

RocksDB komprimiert Datenblöcke pro Level einzeln, üblicherweise mit LZ4 für untere, häufig gelesene Levels und mit dem stärker, aber langsamer komprimierenden Zstandard für höhere Levels mit selten gelesenen, älteren Daten. Weil Compaction ohnehin regelmäßig Daten neu schreibt, lässt sich diese Kompression nahezu ohne zusätzlichen Aufwand in den bestehenden Hintergrundprozess integrieren, anders als bei InnoDB, wo Kompression zusätzliche Seiten-Reorganisationen erzwingt.

In der Praxis berichten Betreiber häufig von zwei- bis vierfach kleineren Tabellen gegenüber unkomprimiertem InnoDB, abhängig von Datentyp und Redundanz der Werte. Für Magento-Installationen mit begrenztem Speicherplatz auf dem Datenbankserver, etwa bei sehr umfangreichen historischen Bestell- oder Protokolldaten, kann das den Unterschied zwischen einem knappen und einem komfortablen Storage-Budget ausmachen.


-- Kompressionsalgorithmus je RocksDB-Level konfigurieren (my.cnf)
-- rocksdb_default_cf_options=compression=kLZ4Compression;
--     bottommost_compression=kZSTD

-- Aktuelle RocksDB-Kompressionsstatistik je Column Family pruefen
SELECT * FROM information_schema.rocksdb_compaction_stats
WHERE cf_name = 'default';

6. Die Kehrseite: Read-Amplifikation und wann sie spürbar wird

Der Preis für günstige Schreibvorgänge ist eine höhere Read-Amplifikation: Ein einzelner Punktzugriff muss im schlimmsten Fall die Memtable und mehrere SST-Levels durchsuchen, bis der aktuelle Wert einer Zeile gefunden ist, während ein B-Tree-Zugriff bei InnoDB direkt über den Index in nahezu konstanter Tiefe zum Ziel führt. Bloom-Filter mindern dieses Problem erheblich, indem sie pro SST-Datei mit hoher Wahrscheinlichkeit ausschließen, dass ein gesuchter Schlüssel überhaupt darin enthalten ist, sodass viele Levels gar nicht erst gelesen werden müssen.

Trotzdem bleibt die Lesecharakteristik unter Last weniger vorhersagbar als bei InnoDB, besonders bei Workloads mit vielen zufälligen Punktlesevorgängen auf kalten, noch nicht im Block-Cache befindlichen Daten. Für Tabellen mit einem hohen Anteil an Random Reads, etwa Produktkataloge mit sehr vielen individuellen Lookups pro Sekunde, kann das die Latenz gegenüber InnoDB spürbar erhöhen, selbst wenn der Gesamtdurchsatz im Batch-Betrieb höher liegt.

7. Praktische Grenzen: Reifegrad, fehlende Foreign Keys, Locking-Unterschiede

MyRocks unterstützt keine referenzielle Integrität über Foreign Keys, was für Tabellen mit expliziten Fremdschlüssel-Constraints, wie sie in klassischen Magento-Kernschemata häufig vorkommen, ein direktes Ausschlusskriterium ist, sofern die Constraints nicht ohnehin in der Anwendungslogik geprüft werden. Auch das Sperrverhalten unterscheidet sich: MyRocks kennt kein Next-Key-Locking wie InnoDB, was das Verhalten bei Phantom-Reads unter bestimmten Isolationsstufen anders ausfallen lässt als gewohnt.

Insgesamt ist MyRocks deutlich jünger im produktiven Breiteneinsatz als InnoDB, das Operations-Tooling für Backup, Monitoring und Fehlerdiagnose ist schmaler, und viele Drittanbieter-Tools sowie Community-Erfahrung sind primär auf InnoDB ausgelegt. Wer MyRocks einsetzt, sollte deshalb bewusst mit weniger etabliertem Betriebswissen kalkulieren und Testphasen entsprechend großzügig planen.

8. Wann sich MyRocks lohnt und wann InnoDB die bessere Wahl bleibt

MyRocks eignet sich besonders für Tabellen mit sehr hoher, überwiegend sequentieller oder append-artiger Schreiblast und seltenen, eher batchartigen Lesezugriffen: Logging, Audit-Trails, Zeitreihendaten, Änderungsprotokolle von Indexern oder Archivtabellen, die primär für spätere Analysen und selten für einzelne Lookups genutzt werden. Auch wenn Speicherplatz auf dem Datenbankserver ein knapper und teurer Faktor ist, spricht die Kompression klar für MyRocks.

Für klassische OLTP-Kerntabellen eines Magento-Shops, etwa Warenkorb, Bestellungen und Produktkatalog mit hohem Anteil an zufälligen Punktlesevorgängen, gemischten Lese- und Schreiblasten sowie Fremdschlüssel-Anforderungen, bleibt InnoDB die robustere und besser erprobte Wahl. Ein pauschaler Wechsel der gesamten Datenbank auf MyRocks ist deshalb in den seltensten Fällen sinnvoll.

9. Migration und Koexistenz: einzelne Tabellen gezielt umstellen

MyRocks lässt sich pro Tabelle einsetzen, während der Rest der Datenbank weiterhin auf InnoDB läuft. Das erlaubt einen risikoarmen, schrittweisen Einstieg: Man identifiziert zunächst konkrete Kandidaten mit hohem Schreibvolumen und geringem Punktleseaufkommen, wandelt sie testweise auf Staging-Umgebungen um und misst Speicherplatzersparnis sowie Antwortzeiten unter realistischer Last, bevor produktiv umgestellt wird.

Für die eigentliche Umstellung genügt ein ALTER TABLE ... ENGINE=ROCKSDB, wobei bei sehr großen Tabellen der Online-DDL-Prozess entsprechend Zeit und I/O-Kapazität benötigt und idealerweise außerhalb der Hauptlastzeiten ausgeführt wird. Monitoring über information_schema.rocksdb_compaction_stats und die RocksDB-eigenen Logdateien hilft danach, Compaction-Verhalten und tatsächliche Kompressionsraten im laufenden Betrieb zu überwachen.


-- Eine bestehende InnoDB-Logtabelle testweise auf MyRocks umstellen
ALTER TABLE admin_action_log ENGINE=ROCKSDB;

-- Größe vorher/nachher vergleichen
SELECT table_name, engine,
       ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name = 'admin_action_log';
Kriterium InnoDB (B-Tree) MyRocks (LSM-Tree) Praxisrelevanz
Schreibverhalten In-Place-Updates, Seiten-Splits Append-only, Compaction im Hintergrund MyRocks bei hoher Insertrate im Vorteil
Speicherplatz Basisgröße ohne native Kompression Häufig zwei- bis vierfach kleiner MyRocks bei knappem Storage-Budget
Punktlesezugriffe Nahezu konstante B-Tree-Tiefe Bloom-Filter mindern Read-Amplifikation, aber langsamer InnoDB bei vielen Random Reads im Vorteil
Foreign Keys Voll unterstützt Nicht unterstützt Ausschlusskriterium für viele Kernschemata
Reifegrad & Tooling Sehr breit erprobt, viel Tooling Jünger, schmaleres Ops-Tooling InnoDB als sichere Standardwahl

Mironsoft

Datenbank-Performance, Index-Tuning und Magento-DB-Optimierung

Magento-Shop, der an langsamen Datenbankabfragen leidet?

Wir analysieren MySQL-Datenbanken auf Performance-Bremsen, optimieren Indizes und Abfragen gezielt und richten Backup- und Replikationsstrategien ein, die im Ernstfall wirklich funktionieren.

Performance-Audit

Slow Query Log und Explain-Pläne systematisch auf Engpässe untersuchen.

Index-Optimierung

Indizes gezielt für die tatsächliche Abfragelast des Shops aufbauen.

Backup-Strategie

Zuverlässige Backup- und Restore-Prozesse für produktive Magento-Datenbanken einrichten.

10. Zusammenfassung

MyRocks in MySQL: Das Wichtigste auf einen Blick

LSM-Tree-Prinzip

Schreibvorgänge landen zunächst in der Memtable, werden als sortierte SST-Dateien geschrieben und im Hintergrund per Compaction verschmolzen, statt Zeilen sofort in-place zu aktualisieren.

Schreibvorteil

Geringere Write Amplification durch sequentielle statt zufälliger I/O, besonders bei sehr hoher Insertrate wie Logs und Zeitreihendaten spürbar.

Kompressionsvorteil

Kompression pro RocksDB-Level ohne zusätzlichen Overhead, in der Praxis oft zwei- bis vierfach kleinere Tabellen als bei InnoDB.

Grenzen

Höhere Read-Amplifikation bei Random Reads, keine Foreign Keys, geringerer Reifegrad und schmaleres Betriebstooling als InnoDB.

11. FAQ: MyRocks in MySQL: Das Wichtigste auf einen Blick

1Was unterscheidet MyRocks grundlegend von InnoDB?
InnoDB speichert Daten als B-Tree mit In-Place-Updates, MyRocks nutzt einen Log-Structured-Merge-Tree über RocksDB, bei dem Schreibvorgänge zunächst angehängt und später im Hintergrund per Compaction zusammengeführt werden.
2Woher stammt RocksDB, die Grundlage von MyRocks?
RocksDB wurde von Facebook, dem heutigen Meta-Konzern, entwickelt und baut konzeptionell auf Googles LevelDB auf. MyRocks bildet relationale MySQL-Tabellen auf das Key-Value-Modell von RocksDB ab.
3Wie stark lässt sich Speicherplatz mit MyRocks tatsächlich sparen?
In der Praxis werden häufig zwei- bis vierfach kleinere Tabellen gegenüber unkomprimiertem InnoDB berichtet, abhängig von Datentyp, Redundanz der Werte und gewähltem Kompressionsalgorithmus je RocksDB-Level.
4Was bedeutet Read-Amplifikation bei MyRocks konkret?
Ein Punktzugriff muss im schlimmsten Fall Memtable und mehrere SST-Levels durchsuchen, bis der aktuelle Wert gefunden ist. Bloom-Filter mindern das erheblich, machen es aber nicht vollständig verschwinden.
5Unterstützt MyRocks Foreign Keys?
Nein, MyRocks unterstützt keine referenzielle Integrität über Foreign-Key-Constraints, was Tabellen mit solchen Anforderungen für eine Umstellung ausschließt, sofern die Prüfung nicht in der Anwendungslogik erfolgt.
6Für welche Magento-Tabellen kommt MyRocks realistisch infrage?
Vor allem Tabellen mit hohem Insert-Volumen und seltenen Punktlesezugriffen wie Changelog-Tabellen der Indexer, Admin-Aktionsprotokolle oder Kundenaktivitätslogs, nicht die transaktionalen Kerntabellen.
7Lässt sich MyRocks nur für einzelne Tabellen aktivieren?
Ja, MyRocks lässt sich pro Tabelle per ALTER TABLE ... ENGINE=ROCKSDB einsetzen, während der Rest der Datenbank weiter auf InnoDB läuft, was einen risikoarmen, schrittweisen Einstieg erlaubt.
8Ist MyRocks in Standard-MySQL-Community-Server verfügbar?
Standardmäßig ist MyRocks in Percona Server for MySQL enthalten und als Plugin in MariaDB nutzbar. Für den offiziellen MySQL Community Server muss es aus dem Quellcode selbst gebaut werden.
9Wie unterscheidet sich das Sperrverhalten von MyRocks gegenüber InnoDB?
MyRocks kennt kein Next-Key-Locking wie InnoDB, wodurch sich das Verhalten bei Phantom-Reads unter bestimmten Isolationsstufen von den gewohnten InnoDB-Garantien unterscheiden kann.
10Sollte man die komplette Magento-Datenbank auf MyRocks umstellen?
In den meisten Fällen nicht. Sinnvoller ist es, gezielt schreiblastige Log- und Protokolltabellen umzustellen und die transaktionalen Kerntabellen mit Fremdschlüsseln auf InnoDB zu belassen.