Datenbanken

Wo eine Website schnell oder langsam ist: in ihrer Datenbank.

Wir installieren, optimieren, replizieren und sichern die Datenbank hinter Ihrer Anwendung - und beweisen die Sicherungen, indem wir sie wiederherstellen.

Läuft auf und gebaut mit
  • MySQL
  • MariaDB
  • PostgreSQL
  • Redis
  • MongoDB
  • Elasticsearch

Sieben Datenbanksysteme, gezeichnet als ein Schema

Jeder Kasten ist eine Datenbank, die wir installieren, optimieren und sichern. Die Linien zeigen, wie sie in den Systemen, die wir betreiben, zusammenarbeiten - die meisten Anwendungen brauchen zwei oder drei davon, nicht eine.

SQLiteeingebettet
Einsatz
Apps und Werkzeuge mit einer Datendatei und jeweils einem Schreiber
Wir stellen ein
journal_mode=WAL
Sicherung
Eine Online-Kopie der Datei, nie die Kopie einer Datei im Betrieb
MySQLrelational
Einsatz
Shops, WordPress und die meisten PHP-Anwendungen
Wir stellen ein
innodb_buffer_pool_size
Sicherung
Vollsicherungen plus Binärlogs, auf jeden Zeitpunkt
Warum wir MySQL betreiben
Redisim Arbeitsspeicher
Einsatz
Cache, Sessions, Warteschlangen und Zähler
Wir stellen ein
maxmemory-policy
Sicherung
Snapshots und eine Append-only-Datei
PostgreSQLrelational
Einsatz
Buchhaltung, ERP, Berichte und komplexe Abfragen
Wir stellen ein
shared_buffers · work_mem
Sicherung
Basissicherungen plus archiviertes WAL, auf jeden Zeitpunkt
MariaDBrelational
Einsatz
Dieselben Aufgaben wie MySQL, dazu Galera-Cluster
Wir stellen ein
innodb_buffer_pool_size
Sicherung
mariabackup plus Binärlogs, auf jeden Zeitpunkt
MongoDBDokumente
Einsatz
Datensätze mit wechselnder Struktur: Ereignisse, Kataloge, Inhalte
Wir stellen ein
wiredTiger cacheSizeGB
Sicherung
Ein Replica Set, mit dem oplog für einen Zeitpunkt
  1. Wenn eine App einer Datei entwächst, zieht sie auf einen Datenbankserver um.
  2. MariaDB begann als Fork von MySQL; die meisten Anwendungen wechseln unverändert zwischen beiden.
  3. Redis sitzt davor: Wiederholte Antworten und Sessions bleiben im Speicher.
  4. Derselbe Cache vor PostgreSQL-Anwendungen.
  5. Der Suchindex wird aus der Hauptdatenbank gespeist, nie umgekehrt.
  6. JSONB in PostgreSQL deckt viele Dokumentaufgaben ab, bevor MongoDB nötig wird.

Welche Datenbank für welche Aufgabe

Meist entscheidet die Anwendung, und wir folgen ihr. Wo die Wahl offen ist, wählen wir so.

Die Aufgabe Unsere erste Wahl Geht auch Warum
Ein Shop, eine WordPress-Website oder eine PHP-Anwendung MySQL · MariaDB PostgreSQL Worauf die Anwendung gebaut und getestet wurde, mit der breitesten Unterstützung.
Buchhaltung, ERP und Berichte mit vielen Joins PostgreSQL MySQL 8 Strenge Transaktionen, Fensterfunktionen und ein Planer für komplexe Abfragen.
Cache, Sessions, Warteschlangen und Ratenbegrenzung Redis Memcached Antworten aus dem Speicher. Legen Sie dort ab, was sich bei Verlust neu aufbauen lässt.
Suche über Produkte oder Artikel OpenSearch · Elasticsearch MySQL · PostgreSQL full-text Relevanz, Tippfehler, Filter und Facetten, die eine LIKE-Abfrage nicht bietet. Für einen kleinen Katalog genügt die Volltextsuche der Datenbank selbst.
Eine mobile App, ein Desktop-Werkzeug oder ein kleiner interner Dienst SQLite —Nichts anderes Kein Server zu betreiben: eine Datei, gesichert durch sicheres Kopieren.
Ereignisse, Logs oder Datensätze mit wechselnder Struktur MongoDB PostgreSQL JSONB Flexible Dokumente; PostgreSQL, wenn zusätzlich Joins und Transaktionen nötig sind.
Lesezugriffe, die einem Server entwachsen MySQL · MariaDB · PostgreSQL replicas —Nichts anderes Lesezugriffe verteilt auf Replikate, Schreibzugriffe bleiben auf einem Primärserver.

Fünf Datenbanksysteme im Vergleich

Was jedes System selbst kann, entnommen der eigenen Dokumentation. Das Wort neben dem Marker sagt, wie weit es geht.

Vergleich von MySQL, MariaDB, PostgreSQL, Redis und MongoDB
Fähigkeit MySQL MariaDB PostgreSQL Redis MongoDB
Einsatz Shops, WordPress und die meisten PHP-Anwendungen Dieselben Aufgaben wie MySQL, dazu Galera-Cluster Buchhaltung, ERP, Berichte und komplexe Abfragen Cache, Sessions, Warteschlangen und Zähler Datensätze mit wechselnder Struktur: Ereignisse, Kataloge, Inhalte
Datenmodell Tabellen und Zeilen, abgefragt mit SQL. Tabellen und Zeilen, abgefragt mit SQL. Tabellen und Zeilen, abgefragt mit SQL, mit einem JSONB-Typ für Dokumente. Schlüssel mit Zeichenketten, Hashes, Listen, Mengen, sortierten Mengen oder Streams. JSON-ähnliche Dokumente in Collections, mit der eigenen Abfragesprache von MongoDB.
Transaktionen Unterstützt InnoDB, die Standard-Engine: Commit, Rollback und Wiederherstellung nach Abstürzen. Unterstützt InnoDB ist auch hier die Standard-Engine. Unterstützt Jede Änderung ist eine Transaktion, die bestätigt oder zurückgerollt wird. Teilweise Ein Block von Befehlen läuft ohne Unterbrechung nacheinander ab, aber es gibt kein Rollback. Unterstützt Über mehrere Dokumente hinweg, auf Replica Sets und Sharded Clustern.
Wo die Arbeitsdaten liegen Auf der Festplatte; InnoDB hält einen Buffer Pool der meistgenutzten Daten im Arbeitsspeicher. Auf der Festplatte; InnoDB hält einen Buffer Pool der meistgenutzten Daten im Arbeitsspeicher. Auf der Festplatte; Shared Buffers halten die meistgenutzten Daten im Arbeitsspeicher. Im Arbeitsspeicher; Snapshots und eine Append-only-Datei schreiben sie auf die Platte. Auf der Festplatte; WiredTiger hält einen Cache der meistgenutzten Daten im Arbeitsspeicher.
Eingebaute Replikation Unterstützt Quelle zu Replikaten, asynchron oder semisynchron. Unterstützt Quelle zu Replikaten, dazu Galera Cluster für synchrones Multi-Primary. Unterstützt Streaming-Replikation; Hot-Standby-Replikate können Leseabfragen beantworten. Unterstützt Leader zu Replikaten, standardmäßig asynchron; Replikate können Lesezugriffe bedienen. Unterstützt Replica Sets: mehrere Server mit denselben Daten und automatischem Failover.
Daten auf mehrere Server verteilen Zusatz NDB Cluster, eine eigene Engine, die Daten automatisch partitioniert. Zusatz Die Storage-Engine Spider, die Tabellen auf mehrere MariaDB-Server verteilt (Sharding). Teilweise Partitionierung nach Bereich, Liste oder Hash teilt eine Tabelle innerhalb eines Servers. Unterstützt Redis Cluster verteilt die Schlüssel auf mehrere Knoten. Unterstützt Sharding ist eingebaut, pro Collection.
Wiederherstellung zu einem Zeitpunkt Unterstützt auf jede Sekunde, die das Protokoll abdeckt Unterstützt auf jede Sekunde, die das Protokoll abdeckt Unterstützt auf jede Sekunde, die das Protokoll abdeckt Teilweise bis zum letzten Schreibvorgang in der Append-only-Datei Unterstützt auf jede Sekunde, die das Protokoll abdeckt

Seitlich scrollen, um alle fünf Systeme zu sehen.

  • Unterstützt das System erledigt es selbst
  • Teilweise mit Einschränkung
  • Zusatz eine eigene Komponente oder Engine

Funktionen unterscheiden sich je nach Version; maßgeblich ist die Dokumentation der Version, die Sie betreiben.

Quellen: MySQL Reference Manual MariaDB Knowledge Base PostgreSQL Documentation Redis Documentation MongoDB Manual

Warum wir MySQL betreiben

Fünf Ebenen, auf denen eine Datenbank schneller wird

Eine langsame Datenbank wird selten an einer einzigen Stelle repariert. Das sind die Ebenen in der Reihenfolge, in der man sie meist ansieht: die günstigste Änderung zuerst, die teuerste zuletzt.

Fünf Optimierungsebenen in der üblichen Reihenfolge: Abfragen, Schema und Indizes, Engine-Einstellungen, Cache, Hardware. Dieselben fünf Ebenen werden in der nummerierten Liste danach beschrieben. Abfragen Schema und Indizes Engine-Einstellungen Cache Hardware
Die Nummern zeigen die übliche Reihenfolge der Arbeit.
  1. Abfragen

    Das Slow-Query-Log nennt die schlechtesten Abfragen, und EXPLAIN zeigt, warum jede langsam ist.

    slow_query_log · pg_stat_statements · EXPLAIN ANALYZE
  2. Schema und Indizes

    Eine auf ihre Fragen zugeschnittene Tabelle und der passende Index machen aus dem Lesen jeder Zeile eine kurze Suche - das Beispiel weiter unten ist genau ein solcher Index.

    CREATE INDEX · ADD INDEX
  3. Engine-Einstellungen

    Der Arbeitsspeicher wird zwischen Datenbank, Anwendung und System aufgeteilt, danach werden die Puffer jeder Engine passend gesetzt.

    innodb_buffer_pool_size · shared_buffers · work_mem · wiredTiger cacheSizeGB
  4. Cache

    Wiederholte Antworten und Sitzungen bleiben im Arbeitsspeicher, sodass die Datenbank seltener gefragt wird.

    maxmemory-policy
  5. Hardware

    Mehr Arbeitsspeicher, schnellere Platten oder mehr Prozessorkerne, wenn die Ebenen darüber ausgeschöpft sind.

    RAM · CPU · disk I/O
Auch die PHP-Seite optimieren

Eine langsame Abfrage, gefunden und behoben

Hinter den meisten langsamen Seiten steckt eine Abfrage. Das Slow-Query-Log nennt sie, EXPLAIN zeigt, warum sie langsam ist, und oft ist ein einziger Index die ganze Lösung.

SELECT id, total, created_at
FROM orders
WHERE customer_id = 4821
ORDER BY created_at DESC
LIMIT 20;
Eine Beispielabfrage auf einer Beispieltabelle

Vorher

type
ALL
key
NULL
Extra
Using where; Using filesort

Liest jede Zeile der Tabelle und sortiert dann, was es gefunden hat.

Die Lösung: ein Index

ALTER TABLE orders
  ADD INDEX idx_customer_created (customer_id, created_at);

Nachher

type
ref
key
idx_customer_created
Extra
Backward index scan

Liest nur die Zeilen dieses Kunden, bereits sortiert.

Ein Backup zählt erst, wenn es wiederhergestellt wurde

Eine nächtliche Kopie allein verliert den Tag. Wird auch das Änderungsprotokoll aufbewahrt, bringen wir die Datenbank auf die Sekunde vor einem Fehler zurück.

Nächtliche Vollsicherung00:00 Bis hier wiederhergestellt14:31:59 Ein DELETE ohne WHERE14:32:00
Jede Änderung, sofort ins Protokoll geschrieben Auf die Sicherung nachgespielt
Ein Beispieltag. Die Uhrzeiten sind erfunden.
  1. Die letzte Vollsicherung wiederherstellen

    Auf einem separaten Server, damit die Live-Datenbank unberührt bleibt, während wir arbeiten.

  2. Das Protokoll bis zum Moment davor nachspielen

    Binärlogs für MySQL und MariaDB, archiviertes WAL für PostgreSQL, das oplog für MongoDB.

  3. Prüfen, dann die Daten zurückholen

    Entweder werden die verlorenen Zeilen zurückkopiert, oder die wiederhergestellte Kopie übernimmt - Ihre Entscheidung, mit dem Unterschied vor Augen.

Die Wiederherstellung auf einen Zeitpunkt hängt vom System ab:

  • MySQL · MariaDB · PostgreSQL · MongoDBauf jede Sekunde, die das Protokoll abdeckt
  • Redisbis zum letzten Schreibvorgang in der Append-only-Datei
  • SQLitebis zur letzten Kopie der Datei
  • OpenSearch · Elasticsearchbis zum letzten Snapshot, dann aus der Quelle neu aufgebaut

Wiederherstellungstests gehören zur Betreuung, die wir mit Ihnen vereinbaren: auf einen separaten Server, nach festem Plan, mit jedem Ergebnis dokumentiert. Ein Backup, das niemand wiederhergestellt hat, ist eine Hoffnung, kein Backup.

Die übrige Arbeit

Was eine Datenbank vom Tag der Installation bis zum Tag des Upgrades braucht, und die Einstellungen, die jeder Schritt berührt.

  • Installation und Dimensionierung

    Die Version, die Ihre Anwendung unterstützt, aus dem eigenen Repository des Herstellers. Der Speicher wird zwischen Datenbank, Anwendung und System aufgeteilt, bevor irgendetwas anderes eingestellt wird.

    innodb_buffer_pool_size · shared_buffers · maxmemory · -Xmx
  • Indizes und langsame Abfragen

    Das Slow-Query-Log wird gelesen, die schlimmsten Abfragen erklärt, und Indizes werden mit dokumentierter Begründung ergänzt oder entfernt.

    slow_query_log · pg_stat_statements · EXPLAIN ANALYZE
  • Replikation

    Eine zweite Kopie, die der ersten folgt - um Lesezugriffe zu verteilen und zu übernehmen, wenn der Primärserver ausfällt.

    GTID · Galera · streaming replication · replica set
  • Sicherheit

    Erreichbar nur im privaten Netz, ein Benutzer pro Anwendung mit genau den Rechten, die sie braucht, und verschlüsselte Verbindungen überall, wo Verkehr den Server verlässt.

    bind-address · TLS · GRANT · SCRAM · ACL
  • Überwachung

    Verbindungen, Replikationsverzögerung, Speicherplatz und langsame Abfragen - mit einer Warnung, bevor eine Grenze erreicht ist, nicht danach.

    max_connections · Seconds_Behind_Source · pg_stat_replication
  • Upgrades

    Zuerst an einer Kopie geprobt, Replikate vor dem Primärserver, und der Weg zurück ist aufgeschrieben, bevor wir beginnen.

    pg_upgrade · mariadb-upgrade · rolling restart

Sagen Sie uns, was Ihre Datenbank tut

Welches System, wie groß, wo es läuft und was Ihnen daran Sorgen macht. Wir sehen es uns zuerst an und erstellen nach einem Gespräch ein Angebot für Einrichtung oder Betreuung.

MickeyAntwortet in Sekunden