MySQL-Leistungsoptimierung: Wichtige Strategien und bewährte Methoden

Entfesseln Sie das volle Potenzial Ihrer MySQL-Datenbank mit diesem umfassenden Leitfaden zur Leistungsoptimierung. Entdecken Sie wesentliche Strategien, die intelligente Indizierung, fortgeschrittene Query-Optimierung mit `EXPLAIN` und kritische Serverkonfigurationseinstellungen (`my.cnf`) wie `innodb_buffer_pool_size` abdecken. Lernen Sie bewährte Methoden für Schema-Design, Hardware-Überlegungen und proaktives Monitoring mit dem Slow Query Log kennen. Dieser Artikel liefert umsetzbare Einblicke und praktische Beispiele, die Ihnen helfen, eine schnelle, skalierbare und reaktionsschnelle MySQL-Umgebung aufzubauen und zu warten.

MySQL-Leistungsoptimierung: Wichtige Strategien und bewährte Methoden

Die MySQL-Leistungsoptimierung funktioniert am besten, wenn Sie aufhören, sie wie eine Checkliste zu behandeln, und stattdessen als Workload-Review betrachten. Die Datenbank tut genau das, was die Anwendung von ihr verlangt. Manchmal ist die Lösung ein Index. Manchmal ist es eine bessere Abfrage. Manchmal sind es weniger Verbindungen, eine andere Schema-Wahl oder ein Bericht, der mittags nicht auf dem Primärserver laufen sollte.

Die beste MySQL-Leistungsoptimierung reduziert zuerst unnötige Arbeit. Hardware und Konfiguration sind wichtig, aber sie sollten einen sauberen Workload unterstützen, nicht einen Query kompensieren, der bei jeder Anfrage die halbe Datenbank liest.

1. Optimale Indizierungsstrategien

Indizes sind grundlegend für die Datenbankleistung, insbesondere bei leseintensiven Workloads. Sie ermöglichen MySQL, Zeilen schnell zu lokalisieren, ohne die gesamte Tabelle zu scannen, und beschleunigen SELECT-Operationen, WHERE-Klausel-Filterung, ORDER BY- und GROUP BY-Klauseln sowie JOIN-Operationen erheblich.

Was sind Indizes und warum sind sie wichtig?

Ein Index ist eine spezielle Nachschlagetabelle, die die Datenbank-Suchmaschine verwenden kann, um den Datenabruf zu beschleunigen. Stellen Sie es sich wie ein Index in einem Buch vor: Anstatt jede Seite zu lesen, um ein Thema zu finden, gehen Sie zum Index, finden das Thema und werden zur richtigen Seitenzahl geführt. In MySQL sind Indizes typischerweise B-Tree-Strukturen, die effizient für Bereichsabfragen und exakte Lookups sind.

Während Indizes Lesevorgänge beschleunigen, fügen sie Schreiboperationen (INSERT, UPDATE, DELETE) Overhead hinzu, da der Index selbst ebenfalls aktualisiert werden muss. Daher ist eine sorgfältige Abwägung erforderlich, um eine Überindizierung zu vermeiden.

Bewährte Methoden für die Indizierung

  • Indizieren Sie Spalten, die in WHERE-, JOIN-, ORDER BY- und GROUP BY-Klauseln verwendet werden: Dies sind die primären Kandidaten für die Indizierung. Stellen Sie sicher, dass Spalten, die in Join-Bedingungen zwischen Tabellen verwendet werden, in beiden Tabellen indiziert sind.
  • Bevorzugen Sie zusammengesetzte Indizes: Wenn Abfragen häufig nach mehreren Spalten filtern oder sortieren, kann ein zusammengesetzter Index ((col1, col2, col3)) effizienter sein als mehrere einzelne Spaltenindizes. Die Reihenfolge der Spalten in einem zusammengesetzten Index ist wichtig. Gleichheitsprädikate kommen normalerweise vor Bereichsprädikaten, und der Index sollte der tatsächlichen Abfrageform entsprechen, nicht einer generischen Vorstellung von Selektivität.
    -- Erstellen Sie einen zusammengesetzten Index auf last_name und first_name
    CREATE INDEX idx_last_first_name ON users (last_name, first_name);
    
  • Vermeiden Sie Überindizierung: Zu viele Indizes können Schreiboperationen verlangsamen und übermäßig viel Speicherplatz verbrauchen. Indizieren Sie nur Spalten, die tatsächlich davon profitieren.
  • Berücksichtigen Sie die Index-Selektivität: Ein Index ist am effektivsten, wenn er die Anzahl der Zeilen, die MySQL untersuchen muss, signifikant reduziert. Spalten mit hoher Kardinalität (viele eindeutige Werte) sind gute Kandidaten für die Indizierung.
  • Überprüfen Sie regelmäßig die Indexnutzung: Verwenden Sie SHOW INDEX FROM table_name;, um Definitionen und Kardinalitätsschätzungen zu überprüfen, und prüfen Sie sys.schema_unused_indexes, wo verfügbar. Behandeln Sie Berichte über ungenutzte Indizes als Kandidaten, nicht als Beweis; der Server hat möglicherweise einen monatlichen Job oder einen seltenen Admin-Workflow noch nicht beobachtet.

2. Meisterung der Query-Optimierung

Selbst bei perfekter Indizierung können schlecht geschriebene Abfragen die Leistung beeinträchtigen. Bei der Query-Optimierung geht es darum, effizientes SQL zu schreiben, das Indizes effektiv nutzt und den Ressourcenverbrauch minimiert.

Die EXPLAIN-Anweisung: Ihr bester Freund

Die EXPLAIN-Anweisung ist unschätzbar wertvoll, um zu verstehen, wie MySQL Ihre Abfragen ausführt. Sie zeigt den Ausführungsplan, einschließlich der verwendeten Indizes, wie Tabellen verknüpft werden und potenzielle Leistungsengpässe.

EXPLAIN SELECT * FROM orders WHERE customer_id = 123 AND order_date > '2023-01-01';

Wichtige EXPLAIN-Ausgabeinterpretationen:

  • type: Gibt an, wie Tabellen verknüpft werden. Zielen Sie auf const, eq_ref, ref, range. Vermeiden Sie ALL (vollständiger Tabellenscan), wenn möglich.
  • rows: Eine Schätzung der Anzahl der Zeilen, die MySQL untersuchen muss. Niedriger ist besser.
  • key: Der tatsächlich von MySQL verwendete Index.
  • Extra: Liefert entscheidende Details:
    • Using filesort: MySQL muss einen zusätzlichen Durchlauf durchführen, um die Daten zu sortieren (kann langsam sein).
    • Using temporary: MySQL muss eine temporäre Tabelle erstellen, um die Abfrage zu verarbeiten (kann langsam sein).
    • Using index: Ein 'Covering Index' wurde verwendet, was bedeutet, dass alle für die Abfrage benötigten Daten direkt im Index gefunden wurden, was einen Zugriff auf die Datenzeilen vermeidet. Sehr effizient.

Effiziente WHERE-Klauseln

  • Verwenden Sie LIMIT für die Paginierung: Geben Sie immer eine LIMIT-Klausel an, wenn Sie eine Teilmenge von Ergebnissen abrufen, insbesondere für die Paginierung.
  • Vermeiden Sie führende Wildcards in LIKE: LIKE '%keyword' verhindert die Verwendung eines Index auf der Spalte und erzwingt einen vollständigen Tabellenscan. Bevorzugen Sie LIKE 'keyword%'.
  • Verwenden Sie keine Funktionen auf indizierten Spalten in WHERE: WHERE YEAR(order_date) = 2023 verhindert die Indexnutzung auf order_date. Verwenden Sie stattdessen WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'.
  • Verwenden Sie klare Bereichsprädikate: WHERE id >= 10 AND id <= 20 und WHERE id BETWEEN 10 AND 20 sind für inklusive Bereiche äquivalent. Für Daten und Zeitstempel sind halboffene Bereiche oft sicherer:
    WHERE created_at >= '2025-01-01'
      AND created_at <  '2025-02-01'
    

Optimierung von JOINs

  • Verknüpfen Sie auf indizierten Spalten: Stellen Sie sicher, dass Spalten, die in JOIN-Bedingungen verwendet werden, in beiden Tabellen indiziert sind.
  • Wählen Sie geeignete JOIN-Typen: Verstehen Sie INNER JOIN, LEFT JOIN, RIGHT JOIN und verwenden Sie den, der Ihren Anforderungen genau entspricht.
  • Lassen Sie den Optimierer arbeiten, dann überprüfen Sie: MySQL kann innere Joins neu anordnen, daher ist die SQL-Textreihenfolge nicht immer die Ausführungsreihenfolge. Verwenden Sie EXPLAIN, um den Plan zu sehen. Greifen Sie nur dann zu Optimierer-Hinweisen, wenn Sie einen schlechten Plan gemessen haben und verstehen, warum er schlecht ist.

Allgemeine bewährte Methoden für Abfragen

  • Vermeiden Sie SELECT *: Listen Sie explizit die Spalten auf, die Sie benötigen. Dies reduziert Netzwerkverkehr, Speichernutzung und ermöglicht Covering Indizes.
  • Gehen Sie nicht davon aus, dass Unterabfragen schlecht sind: Modernes MySQL kann viele Unterabfragen gut optimieren. Schreiben Sie nur um, nachdem Sie den Plan und das Timing überprüft haben. Eine lesbare Unterabfrage, die gut performt, ist besser als ein cleverer Join, den niemand warten möchte.
  • Batch-Operationen: Verwenden Sie für INSERTs oder UPDATEs mehrerer Zeilen eine einzelne Anweisung, um mehrere Werte einzufügen/zu aktualisieren, anstatt einzelne Anweisungen für jede Zeile. Dies reduziert den Transaktions-Overhead.
    -- Batch INSERT Beispiel
    INSERT INTO products (name, price) VALUES
    ('Produkt A', 10.00),
    ('Produkt B', 20.00),
    ('Produkt C', 30.00);
    

3. Datenbank-Schema-Design für Leistung

Ein gut durchdachtes Schema bildet die Grundlage für eine leistungsstarke Datenbank. Entscheidungen, die während des Schema-Designs getroffen werden, haben erhebliche Auswirkungen auf die Abfrageeffizienz und die Datenintegrität.

  • Normalisierung vs. Denormalisierung:
    • Normalisierung (z. B. 3NF) reduziert Datenredundanz und verbessert die Datenintegrität, führt jedoch typischerweise zu mehr JOINs.
    • Denormalisierung führt kontrollierte Redundanz ein, um JOINs zu reduzieren und bestimmte Leseabfragen zu beschleunigen, kann aber die Datenkonsistenz erschweren. Ein ausgewogener Ansatz, oft leicht denormalisiert für Berichte oder bestimmte High-Read-Szenarien, ist üblich.
  • Angemessene Datentypen: Wählen Sie den kleinstmöglichen Datentyp, der die erforderlichen Informationen speichern kann. Die Verwendung von INT anstelle von BIGINT, wenn ein kleinerer Bereich ausreicht, oder VARCHAR(255) anstelle von TEXT für kürzere Zeichenfolgen spart Speicherplatz und verbessert die Leistung.
    • CHAR hat eine feste Länge, VARCHAR hat eine variable Länge. Verwenden Sie CHAR für Daten mit fester Länge (z. B. UUIDs, wenn immer gleich lang), VARCHAR für Daten mit variabler Länge.
  • Verwenden Sie immer Primärschlüssel: Jede InnoDB-Tabelle sollte einen Primärschlüssel haben. Auto-Inkrement-Ganzzahlen sind für viele OLTP-Systeme einfach und effizient, aber sie sind nicht die einzig gültige Wahl. Wählen Sie einen stabilen Schlüssel, der sekundäre Indizes einigermaßen klein hält und zufällige Schreibmuster vermeidet, es sei denn, Sie haben dafür geplant.
  • Indizieren Sie Fremdschlüssel: Stellen Sie sicher, dass Spalten, die an Fremdschlüsselbeziehungen beteiligt sind, indiziert sind. Dies beschleunigt JOINs und Kaskadenoperationen.

4. Server-Konfigurationstuning (my.cnf/my.ini)

Das Verhalten von MySQL wird stark von seiner Konfigurationsdatei (my.cnf unter Linux, my.ini unter Windows) beeinflusst. Die Optimierung dieser Einstellungen an Ihre Hardware und Ihren Workload ist entscheidend.

Kritische InnoDB-Einstellungen

Für die meisten modernen MySQL-Bereitstellungen mit dem InnoDB-Speicher-Engine sind diese Einstellungen von größter Bedeutung:

  • innodb_buffer_pool_size: Dies ist oft die kritischste Einstellung. Es ist der Speicherbereich, in dem InnoDB Tabellendaten und Indizes zwischenspeichert. Ein üblicher Ausgangspunkt auf dedizierten Datenbankservern sind 50-75 % des RAM, manchmal nach Messung auch höher. Lassen Sie Platz für das Betriebssystem, Verbindungsspeicher, Backups und Überwachungsagenten.
    [mysqld]
    innodb_buffer_pool_size = 8G  # Beispiel für einen 16GB RAM Server
    
  • innodb_log_file_size: Die Größe der InnoDB-Redo-Logs. Größere Logs können den Checkpoint-Druck bei schreibintensiven Workloads reduzieren, können aber die Wiederherstellungszeit nach einem Absturz verlängern. Der richtige Wert hängt vom Schreibvolumen und den Wiederherstellungserwartungen ab; kopieren Sie keine feste Größe aus einem alten Tuning-Guide.
  • innodb_flush_log_at_trx_commit: Steuert, wie streng InnoDB die ACID-Compliance in Bezug auf die Transaktionsdauerhaftigkeit einhält.
    • 1 (Standard): Vollständig ACID-konform. Das Log wird bei jedem Transaktions-Commit auf die Festplatte geschrieben. Am sichersten, aber am langsamsten.
    • 0: Das Log wird etwa einmal pro Sekunde in die Logdatei geschrieben. Am schnellsten, aber bis zu 1 Sekunde Transaktionen können bei einem Absturz verloren gehen.
    • 2: Das Log wird bei jedem Commit in den OS-Cache geschrieben und etwa einmal pro Sekunde auf die Festplatte gespült. Ein Kompromiss, aber ein OS-Absturz könnte Transaktionen verlieren.
    • Wählen Sie basierend auf den Anforderungen Ihrer Anwendung an Datenintegrität im Vergleich zu den Leistungsanforderungen.

Andere wichtige Einstellungen

  • max_connections: Die maximale Anzahl gleichzeitiger Client-Verbindungen. Ein zu hoher Wert verbraucht mehr RAM; ein zu niedriger Wert kann zu 'Too many connections'-Fehlern führen. Passen Sie es basierend auf dem Verbindungspooling Ihrer Anwendung und der Spitzenlast an.
  • tmp_table_size und max_heap_table_size: Diese definieren die maximale Größe für temporäre Tabellen im Speicher. Wenn eine temporäre Tabelle diese Größe überschreitet, schreibt MySQL sie auf die Festplatte, was zu erheblichen Verlangsamungen führt. Erhöhen Sie diese Werte, wenn EXPLAIN häufig Using temporary anzeigt, insbesondere bei GROUP BY- oder ORDER BY-Operationen auf großen Datensätzen.
  • sort_buffer_size: Der Puffer, der für Sortieroperationen verwendet wird (ORDER BY, GROUP BY). Wenn Abfragen oft große Sortierungen beinhalten und Using filesort in EXPLAIN erscheint, erwägen Sie eine Erhöhung (pro Verbindung).
  • join_buffer_size: Wird für vollständige Tabellenscans verwendet, wenn Tabellen ohne Indizes verknüpft werden. Wenn EXPLAIN dies anzeigt, deutet es normalerweise auf einen fehlenden Index hin, aber ein größerer Puffer kann bei nicht indizierten Joins helfen.
  • query_cache_size: Veraltet in MySQL 5.7.20 und entfernt in MySQL 8.0. Obwohl es verlockend erscheint, Abfrageergebnisse zwischenzuspeichern, wird es aufgrund hoher Sperrkonflikte oft zu einem Leistungsengpass, insbesondere auf stark ausgelasteten Servern. Es wird allgemein empfohlen, es zu deaktivieren (query_cache_size = 0) und sich auf Caching auf Anwendungsebene oder schnellere Speicher-Engines zu verlassen.

Tipp: Starten Sie Ihren MySQL-Server nach Konfigurationsänderungen neu, damit sie wirksam werden. Testen Sie Änderungen immer zuerst in einer Staging-Umgebung, bevor Sie sie in der Produktion anwenden.

5. Hardware- und Betriebssystem-Überlegungen

Selbst die optimierteste MySQL-Instanz kann durch unzureichende Hardware oder schlecht konfigurierte Betriebssystemeinstellungen ausgebremst werden.

  • RAM: Entscheidend für innodb_buffer_pool_size. Je mehr RAM für den Buffer Pool verfügbar ist, desto seltener muss MySQL auf die Festplatte zugreifen.
  • CPU: Multi-Core-CPUs sind vorteilhaft, insbesondere für die gleichzeitige Abfrageausführung und komplexe Operationen.
  • Festplatten-I/O: Dies ist oft ein großer Engpass. SSD-basierter Speicher ist die normale Basislinie für viel genutztes Produktions-MySQL, da zufällige I/O wichtig ist. Für selbstverwaltete Server sollten Sie Redundanz und Schreibverhalten sorgfältig abwägen. Achten Sie bei Cloud-Datenbanken auf bereitgestellte IOPS, Burst-Limits, Latenz und Backup-Fenster.
  • Netzwerklatenz: Minimieren Sie bei remoteem Datenbankzugriff die Netzwerklatenz zwischen dem Anwendungsserver und dem Datenbankserver.
  • Betriebssystem-Tuning: Stellen Sie sicher, dass die OS-Einstellungen für einen Datenbank-Workload optimiert sind. Erwägen Sie für Linux die Anpassung von vm.swappiness (um unnötiges Swapping zu verhindern), file-max (Limit für offene Dateien) und ulimit-Einstellungen.

6. Proaktives Monitoring und Analyse

Optimierung ist ein fortlaufender Prozess. Kontinuierliches Monitoring hilft, Leistungstrends zu identifizieren, Engpässe frühzeitig zu erkennen und die Auswirkungen Ihrer Tuning-Bemühungen zu validieren.

  • Slow Query Log: Konfigurieren Sie MySQL so, dass Abfragen protokolliert werden, die länger als eine bestimmte Zeit (long_query_time) dauern. Dies ist Ihr primäres Werkzeug zur Identifizierung problematischer Abfragen.
    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/mysql-slow.log
    long_query_time = 1
    log_queries_not_using_indexes = 1
    
  • Analysieren Sie Slow Query Logs: Tools wie pt-query-digest (aus dem Percona Toolkit) können große Slow Query Logs parsen und einen aggregierten Bericht erstellen, der die häufigsten und langsamsten Abfragen hervorhebt.
  • MySQL-Statusvariablen (SHOW STATUS): Liefert Echtzeitinformationen über Serveraktivität, Speichernutzung, Verbindungen und mehr. Nützlich, um Probleme live zu erkennen.
    SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read_requests';
    SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_reads';
    
    • Ein hohes Verhältnis von Innodb_buffer_pool_reads zu Innodb_buffer_pool_read_requests deutet auf eine niedrige Buffer-Pool-Trefferquote hin, was darauf hindeutet, dass innodb_buffer_pool_size möglicherweise zu klein ist.
  • Monitoring-Tools: Nutzen Sie dedizierte Überwachungslösungen wie Percona Monitoring and Management (PMM), Prometheus mit Grafana oder MySQL Enterprise Monitor. Diese bieten umfassende Metriken, Dashboards und Warnmeldungen.
  • Regelmäßige Audits: Überprüfen Sie regelmäßig Ihr Datenbankschema, Ihre Abfragemuster und die Indexnutzung, um sicherzustellen, dass sie optimiert bleiben, während sich Ihre Anwendung weiterentwickelt.

Ein praktischer Optimierungs-Workflow

Wenn Sie ein langsames MySQL-System übernehmen, widerstehen Sie dem Drang, in der ersten Stunde zehn Einstellungen zu ändern. Verwenden Sie einen wiederholbaren Ablauf.

Beginnen Sie mit dem Slow Query Log und den Anwendungs-Traces. Finden Sie die Abfragen, die nach Gesamtzeit wichtig sind, nicht nur nach der schlechtesten Einzelausführung. Eine Abfrage, die 200 ms dauert und 50.000 Mal pro Stunde läuft, kann mehr schaden als ein Bericht, der einmal nachts 20 Sekunden dauert.

Verwenden Sie dann EXPLAIN für die exakte Abfrageform, einschließlich realistischer Parameterwerte:

EXPLAIN
SELECT id, customer_id, total, created_at
FROM orders
WHERE customer_id = 42
  AND status = 'paid'
ORDER BY created_at DESC
LIMIT 20;

Für eine solche Abfrage könnte ein Index auf (customer_id, status, created_at) nützlich sein. Wenn der Bildschirm normalerweise zuerst nach status über alle Kunden filtert, könnte (status, created_at) besser sein. Der richtige Index ergibt sich aus dem Zugriffsmuster, nicht aus den Spaltennamen.

Überprüfen Sie nach der Abfrage- und Index-Review den Speicher. Wenn der aktive Datensatz viel größer als der Buffer Pool ist, wird MySQL häufiger aus dem Speicher lesen. Wenn der Buffer Pool bereits groß ist und der Server immer noch langsam ist, könnte das Problem bei Tabellenscans, schlechter Lokalität, temporären Tabellen oder Schreibdruck liegen. Mehr Speicher hilft nur, wenn der Workload ihn wiederverwenden kann.

Betrachten Sie als Nächstes die Parallelität. Eine Datenbank kann viele kleine Abfragen verarbeiten, aber sie verarbeitet keine unbegrenzte parallele Arbeit. Wenn die App zu viele Verbindungen öffnet, verbringt MySQL möglicherweise mehr Zeit mit dem Jonglieren von Sitzungen als mit dem Erledigen nützlicher Arbeit. Ein Verbindungspool mit einem vernünftigen Maximum verbessert die Leistung oft mehr als das Erhöhen von max_connections.

Validieren Sie schließlich die Änderung. Eine gute Optimierung sollte sich irgendwo bemerkbar machen: weniger untersuchte Zeilen, geringere Abfragelatenz, weniger Festplattenlesedruck, kürzere Sperrwartezeiten, geringere Replikationsverzögerung oder weniger Timeouts. Wenn sich die Metrik nicht bewegt, hat die Änderung entweder den Engpass nicht behoben oder die Messung war zu vage.

Häufige Fehler, die MySQL verlangsamen

Ein häufiger Fehler ist, jeden Fremdschlüssel und jede Filterspalte separat zu indizieren und sich dann zu wundern, warum Schreibvorgänge langsam sind. Fremdschlüsselspalten sollten oft indiziert werden, und Filterspalten profitieren oft von Indizes, aber ein Haufen einzelner Spaltenindizes ersetzt keinen gut gestalteten zusammengesetzten Index.

Ein weiterer Fehler ist die Verwendung von Paginierung mit einem großen Offset:

SELECT *
FROM events
ORDER BY created_at DESC
LIMIT 50 OFFSET 500000;

MySQL muss immer noch an einer großen Anzahl von Zeilen vorbeigehen. Die Keyset-Paginierung ist für tiefe Seiten normalerweise besser:

SELECT *
FROM events
WHERE created_at < '2025-05-01 12:00:00'
ORDER BY created_at DESC
LIMIT 50;

Lange Transaktionen sind eine weitere leise Schmerzquelle. Eine Transaktion, die auf Benutzereingaben wartet, eine externe API aufruft oder einen großen Batch verarbeitet, während sie Sperren hält, kann nicht verwandte Arbeit blockieren. Halten Sie Transaktionen kurz. Erledigen Sie die Datenbankarbeit, committen Sie, und erledigen Sie dann langsame Außenarbeit.

Globale Pufferänderungen können auch nach hinten losgehen. Einstellungen wie sort_buffer_size und join_buffer_size sind pro Verbindung. Sie global zu erhöhen, weil ein Bericht langsam ist, kann die Speichernutzung über viele Sitzungen hinweg vervielfachen. Beheben Sie zuerst die Abfrage. Verwenden Sie bei Bedarf sitzungsbezogene Änderungen für spezielle Jobs.

Wie "Gut" aussieht

Eine gesunde MySQL-Umgebung ist keine, in der jede Abfrage sofort schnell ist. Es ist eine, in der das Team die teuren Abfragen erklären, die schweren Jobs vorhersagen und Engpässe sehen kann, bevor Benutzer sie melden. Das Slow Query Log ist aktiviert. Dashboards zeigen Abfragelatenz, untersuchte Zeilen, Buffer-Pool-Lesevorgänge, Sperrwartezeiten, Festplattenlatenz, Verbindungsanzahlen und Replikationsverzögerung an. Schemaänderungen werden an realistischen Daten getestet. Indizes haben Besitzer und Gründe.

Das ist weniger glamourös als eine riesige Tuning-Checkliste, aber so bleibt MySQL schnell, während sich die Anwendung ändert. Messen Sie den Workload, reduzieren Sie unnötige Arbeit, ändern Sie jeweils eine Sache und bewahren Sie die Beweise auf.