MySQL Performance Optimieren
MySQL Performance optimieren: Praktische Tipps
Langsame Datenbankabfragen bremsen Ihre Website aus. In diesem Guide zeigen wir die wichtigsten Optimierungen für MySQL – von Indexen über Query-Optimierung bis zur Server-Konfiguration.
1. Indexe richtig einsetzen
Indexe sind der wichtigste Faktor für schnelle Abfragen. Ohne Index durchsucht MySQL jede Zeile einzeln.
Index erstellen
-- Einfacher Index CREATE INDEX idx_email ON users(email); -- Zusammengesetzter Index (mehrere Spalten) CREATE INDEX idx_name_created ON users(name, created_at); -- Unique Index (keine Duplikate) CREATE UNIQUE INDEX idx_unique_email ON users(email);
Wann Indexe verwenden?
| Index sinnvoll | Index nicht sinnvoll |
|---|---|
| WHERE-Bedingungen | Kleine Tabellen (< 1000 Zeilen) |
| JOIN-Spalten | Spalten die oft geändert werden |
| ORDER BY Spalten | Spalten mit wenig verschiedenen Werten |
| GROUP BY Spalten | TEXT/BLOB Spalten |
2. Queries optimieren
EXPLAIN verwenden
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
Zeigt wie MySQL die Abfrage ausführt. Achten Sie auf:
- type: "ALL" ist schlecht (Full Table Scan), "ref" oder "const" ist gut
- rows: Je weniger, desto besser
- Extra: "Using index" ist optimal
Häufige Query-Fehler
| ❌ Schlecht | ✅ Besser |
|---|---|
SELECT * |
SELECT id, name, email |
WHERE YEAR(date) = 2026 |
WHERE date BETWEEN '2026-01-01' AND '2026-12-31' |
LIKE '%suchbegriff%' |
LIKE 'suchbegriff%' |
OR in WHERE |
UNION oder IN() |
Beispiel: Query verbessern
-- ❌ Langsam: Funktion auf Spalte verhindert Index SELECT * FROM orders WHERE YEAR(created_at) = 2026; -- ✅ Schnell: Index kann genutzt werden SELECT * FROM orders WHERE created_at >= '2026-01-01' AND created_at < '2027-01-01';
3. Tabellen optimieren
Richtige Datentypen wählen
| Statt | Besser | Warum |
|---|---|---|
| VARCHAR(255) | VARCHAR(50) | Weniger Speicher |
| INT | TINYINT/SMALLINT | Wenn Werte klein sind |
| TEXT | VARCHAR | Wenn Länge bekannt |
| DATETIME | TIMESTAMP | 4 statt 8 Bytes |
Tabelle analysieren & optimieren
-- Statistiken aktualisieren ANALYZE TABLE users; -- Fragmentierung beheben OPTIMIZE TABLE users; -- Tabellenstatus prüfen SHOW TABLE STATUS LIKE 'users';
4. MySQL Konfiguration
In der my.cnf (Linux) oder my.ini (Windows):
[mysqld] # Buffer Pool (50-70% des RAM für dedizierte DB-Server) innodb_buffer_pool_size = 1G # Query Cache (bei MySQL 8 entfernt, bei 5.7 nützlich) query_cache_size = 128M query_cache_type = 1 # Verbindungen max_connections = 150 # Temporäre Tabellen tmp_table_size = 64M max_heap_table_size = 64M # Logs slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2
5. Slow Query Log auswerten
# Aktivieren SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; # Auswerten mit mysqldumpslow mysqldumpslow -s t /var/log/mysql/slow.log
sudo systemctl restart mysql
Quick Wins Checkliste
- ☐ Indexe auf WHERE/JOIN Spalten prüfen
- ☐ SELECT * durch konkrete Spalten ersetzen
- ☐ EXPLAIN bei langsamen Queries nutzen
- ☐ Slow Query Log aktivieren
- ☐ innodb_buffer_pool_size anpassen
- ☐ Regelmäßig OPTIMIZE TABLE ausführen