Welche Konfigurationen verbessern die MySQL-Datenbankleistung?

Von Buffer Pool ueber Indizes bis zu sinnvollen Logging-Einstellungen: die wichtigsten Stellschrauben, mit denen sich die Leistung einer MySQL-Datenbank spuerbar verbessern laesst.

Teilen

Eine MySQL-Datenbank kann mit denselben Daten und derselben Hardware sehr unterschiedlich schnell arbeiten. Ob Abfragen in Millisekunden oder erst nach mehreren Sekunden zurueckkommen, haengt stark von der Konfiguration und vom Datenbankdesign ab. Gerade wenn eine Anwendung waechst, machen sich schlecht gewaehlte Einstellungen schnell bemerkbar. Dieser Artikel zeigt die wichtigsten Stellschrauben, mit denen sich die Leistung einer MySQL-Datenbank verbessern laesst, und ordnet ein, worauf es dabei ankommt.

Der Buffer Pool als zentrale Stellschraube

Bei der heute gaengigen Speicher-Engine InnoDB ist der sogenannte Buffer Pool die wichtigste Komponente fuer die Performance. In diesem Arbeitsspeicherbereich haelt MySQL haeufig benoetigte Daten- und Indexseiten vor, sodass nicht bei jeder Abfrage auf die Festplatte zugegriffen werden muss. Je groesser der Buffer Pool, desto mehr Daten passen in den schnellen Arbeitsspeicher.

Gesteuert wird das ueber den Parameter innodb_buffer_pool_size. Auf einem dedizierten Datenbankserver ist es ueblich, einen erheblichen Teil des verfuegbaren Arbeitsspeichers dafuer zu reservieren. Wichtig ist, genug Reserve fuer das Betriebssystem und andere Prozesse zu lassen, damit der Server nicht anfaengt, auf die Festplatte auszulagern. Bei sehr grossen Buffer Pools kann es zudem sinnvoll sein, diesen ueber den Parameter fuer die Anzahl der Instanzen in mehrere Bereiche aufzuteilen.

Indizes richtig einsetzen

Keine Konfigurationsdatei ersetzt gute Indizes. Sie sind oft der entscheidende Faktor dafuer, ob eine Abfrage schnell oder langsam ist. Ein Index erlaubt es der Datenbank, gezielt die passenden Zeilen zu finden, statt die gesamte Tabelle Zeile fuer Zeile zu durchsuchen.

  • Spalten, die haeufig in WHERE-Bedingungen, JOINs oder ORDER BY vorkommen, sind typische Kandidaten fuer einen Index.
  • Zusammengesetzte Indizes ueber mehrere Spalten koennen mehrere Bedingungen gleichzeitig abdecken.
  • Zu viele Indizes verlangsamen jedoch Schreibvorgaenge und belegen Speicher. Es lohnt sich, regelmaessig zu pruefen, welche Indizes tatsaechlich genutzt werden.

Mit dem Befehl EXPLAIN vor einer Abfrage laesst sich nachvollziehen, wie MySQL die Abfrage ausfuehrt und ob ein Index verwendet wird. Das ist eines der wichtigsten Werkzeuge, um langsame Abfragen zu verstehen.

Langsame Abfragen finden mit dem Slow Query Log

Bevor man optimiert, sollte man wissen, wo das Problem liegt. Das Slow Query Log protokolliert Abfragen, die laenger als eine festgelegte Zeit benoetigen. Aktiviert wird es ueber die Parameter fuer das langsame Abfrageprotokoll und einen Schwellenwert in Sekunden.

Aus diesen Protokollen laesst sich erkennen, welche Abfragen besonders viel Zeit kosten oder besonders haeufig vorkommen. Genau dort lohnt sich die Optimierung am meisten, sei es durch einen zusaetzlichen Index, eine umformulierte Abfrage oder ein angepasstes Datenmodell.

Verbindungen und Threads

Jede Anwendung, die mit der Datenbank spricht, oeffnet Verbindungen. Der Parameter max_connections legt fest, wie viele gleichzeitige Verbindungen erlaubt sind. Ist der Wert zu niedrig, werden Anfragen abgewiesen; ist er zu hoch, kann der Speicherbedarf stark ansteigen, weil jede Verbindung Ressourcen belegt.

In vielen Faellen ist es sinnvoller, auf Anwendungsseite ein Connection Pooling einzusetzen, statt einfach die maximale Verbindungszahl heraufzusetzen. Ein Pool wiederverwendet bestehende Verbindungen und entlastet so die Datenbank.

Logs, Schreibverhalten und Datensicherheit

InnoDB schreibt Aenderungen zunaechst in ein Transaktionsprotokoll, das sogenannte Redo Log. Der Parameter innodb_log_file_size beeinflusst, wie viel Schreiblast die Datenbank vertraegt, bevor Daten endgueltig auf die Festplatte geschrieben werden. Groessere Logdateien koennen bei schreibintensiven Anwendungen helfen, bedeuten aber laengere Wiederherstellungszeiten nach einem Absturz.

Eng damit verbunden ist der Parameter fuer das Flush-Verhalten der Transaktionsprotokolle. Hier gibt es einen klassischen Zielkonflikt zwischen maximaler Datensicherheit und hoher Schreibgeschwindigkeit. Die strengste Einstellung sorgt dafuer, dass jede bestaetigte Transaktion sofort dauerhaft gespeichert ist, kostet aber Leistung. Lockerere Einstellungen sind schneller, koennen im Fehlerfall aber die letzten Transaktionen verlieren. Welche Einstellung passt, haengt davon ab, wie kritisch die Daten sind.

Speicher-Engine und Datentypen

Heute ist InnoDB die Standard-Engine und in den meisten Faellen die richtige Wahl, weil sie Transaktionen und Sperren auf Zeilenebene unterstuetzt. Auch das Datenmodell selbst beeinflusst die Leistung: Passend gewaehlte Datentypen sparen Speicher und beschleunigen Vergleiche. Eine Spalte, die nur kleine Ganzzahlen enthaelt, muss nicht als grosser Zahlentyp definiert sein, und ueberdimensionierte Textfelder kosten unnoetig Ressourcen.

Caching auf Anwendungsebene

Nicht jede Abfrage muss die Datenbank erreichen. Daten, die sich selten aendern, lassen sich auf Anwendungsebene oder mit einem zusaetzlichen Cache-System zwischenspeichern. Dadurch sinkt die Last auf der Datenbank, und die Anwendung antwortet schneller. Wichtig ist eine durchdachte Strategie, wann der Cache erneuert oder verworfen wird, damit keine veralteten Daten ausgeliefert werden.

Messen statt raten

Performance-Optimierung sollte nie auf Vermutungen beruhen. MySQL liefert ueber Statusvariablen und das Performance Schema viele Kennzahlen, etwa zur Auslastung des Buffer Pools oder zur Anzahl der Festplattenzugriffe. Externe Monitoring-Werkzeuge helfen, diese Werte ueber die Zeit zu beobachten. Erst durch Messung laesst sich erkennen, ob eine Aenderung tatsaechlich etwas gebracht hat.

Fazit

Die Leistung einer MySQL-Datenbank haengt von einem Zusammenspiel mehrerer Faktoren ab. Ein ausreichend grosser Buffer Pool, gut gewaehlte Indizes, das Aufspueren langsamer Abfragen und ein sinnvoll konfiguriertes Schreibverhalten gehoeren zu den wirkungsvollsten Massnahmen. Genauso wichtig sind ein passendes Datenmodell und Caching auf Anwendungsebene. Wer Aenderungen konsequent misst und nicht blind Parameter verstellt, erzielt die nachhaltigsten Verbesserungen.

Mehr zum Thema findest du in unserer Übersicht: Software & Entwicklung: Alle Artikel im Überblick.

Verwandte Artikel