Die erste Version meines Aktienanalyse-Repositorys lief auf einer OLTP-Engine, die zweite führt dieselbe Arbeitslast auf einem OLAP-Stack aus. Ich habe mich wegen einer einzigen Optimierung für den OLAP-Stack entschieden, musste aber das gesamte Lakehouse verstehen, um sie zu nutzen.
Das Design von InnoDB bietet drei Garantien, die meine frühen Entscheidungen geprägt haben. Es speichert alle Spalten einer Zeile zusammen, sodass das Abrufen eines Kursbalkens für ein Symbol nur eine Stelle auf der Festplatte berührt, was sich gut für den Datenimport eignet. Ein Indikator, der nur zwei Spalten benötigt, liest dennoch alle Spalten über den Buffer Pool. Indizes beschleunigen Lesevorgänge, verlangsamen aber Schreibvorgänge, da jeder Schreibvorgang jeden B-Baum der Tabelle aktualisieren muss. Das ist hervorragend für selektive Lesevorgänge und schlecht für schreibintensive Importe, weshalb meine Raw*-Tabellen nur einen Primärschlüssel haben.
InnoDB verwendet außerdem ein Undo-Log, das gleichzeitiges Lesen und Schreiben ermöglicht. Wird eine Zeile aktualisiert oder gelöscht, wird der alte Wert gespeichert, damit andere Sitzungen ihn weiterhin lesen können. Einfügungen erzeugen ein kleineres Undo-Log, das beim Commit bereinigt wird. Undo-Logs von Aktualisierungen und Löschungen werden einer globalen Verlaufsliste hinzugefügt, die InnoDB bereinigt, sobald alle Sitzungen, die vor dem Commit begonnen haben, beendet sind. Dieser Mechanismus heißt Multi-Version Concurrency Control, kurz MVCC, und erlaubt es, Einfügungen und Aktualisierungen ohne Blockierung von Lesevorgängen durchzuführen.
Ohne es zu bemerken, hatte ich meine InnoDB-Datenbank nach einem OLAP-Grundprinzip entworfen. Meine Tabelle financialdata enthielt das Datum mit Uhrzeit sowie die OHLC-Kurse, und jeder technische Indikator erforderte einen Join darauf, um das Datum zu finden. Es war eines meiner schlechtesten Datendesigns, und ich erkannte es erst, als die Datenbank über 100 GB umfasste. Die Korrektur war mühsam.
Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing