MySQL Performance-Tuning: Optimierungsleitfaden fuer Produktionsserver
Eine gut optimierte MySQL-Datenbank ist entscheidend fuer die Leistung jeder datengetriebenen Anwendung. Dieser Leitfaden behandelt die wichtigsten Bereiche des MySQL-Tunings: Speicherkonfiguration, Abfrageoptimierung, Indexierungsstrategien und kontinuierliches Monitoring.
InnoDB Buffer Pool und Speicherkonfiguration
Der InnoDB Buffer Pool ist die wichtigste Einstellung fuer die MySQL-Performance. Er speichert Daten und Indizes im RAM zwischen und reduziert so Festplattenzugriffe drastisch.
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# Buffer Pool - 70-80% des verfuegbaren RAMs
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8
# Redo Log fuer bessere Schreibperformance
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
# I/O-Konfiguration
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 1
# Thread- und Verbindungskonfiguration
max_connections = 500
thread_cache_size = 64
table_open_cache = 4000
Ueberpruefen Sie die Buffer-Pool-Auslastung mit:
SELECT
FORMAT(@@innodb_buffer_pool_size / 1073741824, 2) AS buffer_pool_gb,
FORMAT(
(SELECT VARIABLE_VALUE FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data') *
@@innodb_page_size / 1073741824, 2
) AS used_gb;
Langsame Abfragen Identifizieren und Optimieren
Aktivieren Sie das Slow Query Log und analysieren Sie problematische Abfragen:
-- Slow Query Log aktivieren
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL log_queries_not_using_indexes = 'ON';
Verwenden Sie EXPLAIN um den Ausfuehrungsplan zu analysieren:
EXPLAIN ANALYZE
SELECT o.order_id, c.customer_name, SUM(oi.quantity * oi.price) AS total
FROM orders o
JOIN customers c ON o.customer_id = c.id
JOIN order_items oi ON o.order_id = oi.order_id
WHERE o.order_date >= '2026-01-01'
GROUP BY o.order_id, c.customer_name
ORDER BY total DESC
LIMIT 100;
Achten Sie auf type: ALL (Full Table Scan) und Extra: Using filesort in der EXPLAIN-Ausgabe — diese deuten auf fehlende Indizes oder suboptimale Abfragen hin.
Indexierungsstrategien
Effektive Indizes sind der Schluessel zur Abfrageperformance. Erstellen Sie Indizes basierend auf den tatsaechlichen Abfragemustern:
-- Zusammengesetzter Index fuer haeufige Filterkombination
CREATE INDEX idx_orders_date_customer
ON orders (order_date, customer_id);
-- Covering Index: Alle Spalten im Index enthalten
CREATE INDEX idx_order_items_covering
ON order_items (order_id, product_id, quantity, price);
-- Nicht verwendete Indizes identifizieren
SELECT
s.TABLE_SCHEMA, s.TABLE_NAME, s.INDEX_NAME,
s.SEQ_IN_INDEX, s.COLUMN_NAME
FROM information_schema.STATISTICS s
LEFT JOIN performance_schema.table_io_waits_summary_by_index_usage u
ON s.TABLE_SCHEMA = u.OBJECT_SCHEMA
AND s.TABLE_NAME = u.OBJECT_NAME
AND s.INDEX_NAME = u.INDEX_NAME
WHERE u.COUNT_READ = 0 AND s.INDEX_NAME != 'PRIMARY';
Monitoring und Kontinuierliche Optimierung
Richten Sie ein kontinuierliches Monitoring ein, um Performance-Probleme fruehzeitig zu erkennen:
-- Aktive Verbindungen und laufende Abfragen
SELECT COUNT(*) AS active_connections FROM information_schema.PROCESSLIST
WHERE COMMAND != 'Sleep';
-- InnoDB-Metriken pruefen
SHOW ENGINE INNODB STATUS\G
-- Top 10 langsamste Abfragen aus dem Performance Schema
SELECT DIGEST_TEXT, COUNT_STAR, AVG_TIMER_WAIT/1000000000 AS avg_ms
FROM performance_schema.events_statements_summary_by_digest
ORDER BY AVG_TIMER_WAIT DESC
LIMIT 10;
Exportieren Sie diese Metriken in ein Monitoring-System wie Prometheus mit dem MySQL-Exporter und visualisieren Sie sie in Grafana-Dashboards.
Fazit
MySQL Performance-Tuning ist ein iterativer Prozess. Beginnen Sie mit der Speicherkonfiguration, identifizieren Sie langsame Abfragen, optimieren Sie die Indizierung und ueberwachen Sie die Auswirkungen Ihrer Aenderungen kontinuierlich. Vermeiden Sie es, mehrere Einstellungen gleichzeitig zu aendern — so koennen Sie die Wirkung jeder Optimierung isoliert bewerten.