Die Datenbank eines Onlineshops auf MariaDB: Kunden, Produkte, Bestellungen, Positionen, Berichte und Kundenhistorie
Ausgangslage
Die Shop-Datenbank war in Eile entworfen worden und hatte nichts als Primärschlüssel. Bei kleinen Tabellen war alles sofort da, also fielen die fehlenden Indizes nicht auf. Mit wachsenden Daten brauchten Abfragen, die früher Millisekunden dauerten, Hunderte von Millisekunden, und Listen und Berichte unter Last beschäftigten die Datenbank für lange Momente.
Die Aufgabe: durch Messung zeigen, was die fehlenden Indizes auf dem echten Datenbestand kosten, die richtigen Indizes für die typischen Abfragen eines Shops anlegen, einen Filter nach Kunde, die Bestellhistorie mit Join, einen Verkaufsbericht und die Seitenweise-Anzeige, und auf die Fallen hinweisen, durch die ein Index nutzlos bleibt, obwohl er angelegt wurde.
Lösung
Die Datenbank, wie wir sie vorfanden: vier Tabellen, Kunden, Produkte, Bestellungen und Positionen, nur mit Primärschlüsseln. Die Fremdschlüssel zwischen ihnen existierten nur im Anwendungscode, nicht als Constraints in der Datenbank, also hatte nie etwas einen Index auf ihnen angelegt. Für jede typische Abfrage des Shops haben wir den Plan, die Zahl der per Scan gelesenen Zeilen und die Medianzeit festgehalten, dann die richtigen Indizes einen nach dem anderen angelegt und dieselbe Abfrage erneut gemessen.
Die Fallen bekamen eigene Messungen: Fälle, in denen ein Index existiert und die Datenbank ihn nicht oder schlecht nutzt. Und weil ein Index kein Gewinn zum Nulltarif ist, haben wir gemessen, wie stark fünf Indizes das Schreiben verlangsamen und wie viel Platz sie brauchen. Die Daten des Shops zu diesem Zeitpunkt: 100 000 Kunden, 50 000 Produkte, 500 000 Bestellungen und 1,75 Millionen Positionen auf MariaDB 10.11 mit InnoDB, Stand 2026-10.
Ergebnisse
- Kundenhistorie, ein Join über drei Tabellen
- Von 406,8 ms auf 0,075 ms
- Die Bestellungen eines Kunden
- Von 500 000 gelesenen Zeilen auf 5
- Suche nach E-Mail-Adresse
- Von 5,9 ms auf 0,024 ms
- Die zehn neuesten Bestellungen
- Von 39,3 ms auf 0,009 ms
- Verkaufsbericht nach Status und Zeitraum
- Von 34 268 Zeilen auf 3 336 mit einem zusammengesetzten Index
- Der Preis von fünf Indizes auf der Bestelltabelle
- Einfügen 3,1-mal langsamer, Indizes bei 237 Prozent der Tabellengröße