Wir haben eine einfache Webanwendung, die auf einer virtuellen Maschine ausgeführt wird, die ihre Daten in einer MySQL 5.5-Datenbank mit der InnoDB-Engine speichert. Etwa drei Jahre lang hat alles gut funktioniert, aber plötzlich wurde es extrem langsam.
Zum Beispiel habe ich eine sehr einfache Tabelle mit Adressen:
CREATE TABLE `addresses` (
`address_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET latin1 NOT NULL,
`firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
`street` varchar(64) CHARACTER SET latin1 NOT NULL,
`housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
`zip` varchar(5) CHARACTER SET latin1 NOT NULL,
`city` varchar(64) CHARACTER SET latin1 NOT NULL,
`email` varchar(64) CHARACTER SET latin1 NOT NULL,
`phone` varchar(16) CHARACTER SET latin1 NOT NULL,
`birthdate` date NOT NULL,
PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Diese Tabelle enthält ungefähr 800 Einträge, was wirklich nicht viel ist. Aber die Abfrage ausführen
SELECT * FROM addresses
zu Testzwecken scheint es nie zu Ende zu sein. Ich habe dies mit der MySQL-CLI auf dem Server selbst überprüft: Sie gibt einige Zeilen der Tabelle aus und wartet dann sehr lange, bis die nächsten Zeilen ausgegeben werden.
Vielleicht ist es ein Problem in der Datenversandphase, aber ich bin mir nicht sicher.
Die VM verfügt über 2 GB RAM und es werden nur 320 MB verwendet. Die CPU läuft auch mit sehr niedrigen 1 bis 2%. mytop zeigt keine anderen Abfragen an, die den Server blockieren. Der IT-Administrator sagte, dass er auf der Hardwareseite nichts geändert habe.
Ich habe bereits versucht, den Datenbankserver neu zu starten und die virtuelle Maschine neu zu starten. Nichts hat geholfen.
bearbeiten:
EXPLAIN SELECT * FROM addresses
gibt mir dieses Ergebnis:
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | addresses | ALL | NULL | NULL | NULL | NULL | 793 | |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
quelle
mysql -u username -ppassword mydb -e 'SELECT * FROM addresses
wird langsam ausgegeben, aber das Anhängen von `> test.txt` wird sehr schnell ausgeführt. Nun wäre das wahrscheinlich eine andere Frage!? Wie könnte ich das untersuchen?Antworten:
Wenn die CPU-Auslastung niedrig ist, gibt dies an, dass es keine Probleme mit fehlenden Indizes gibt. In diesem Fall müsste die Abfrage nur mehr CPU- und Festplattenzugriff benötigen. Sie sagten auch, dass es 3 Jahre lang gut funktioniert hat.
Haben Sie die allgemeine Datenträgerzugriffsgeschwindigkeit überprüft (insbesondere auf der Partition, auf der sich die Datenbank befindet)? ZB
dd
wie hier verwenden . Was Sie beschreiben, klingt wie eine tote Festplatte oder ein halbtoter Überfall. Hast du Backups, hoffe ich?quelle
Sie können ein paar Dinge ausprobieren,
Durch die Indizierung können Datensätze schnell gefunden werden, ohne zuvor einen vollständigen Tabellenscan durchzuführen. Dadurch werden die Ausführungszeiten erheblich verkürzt.
Bei Verwendung vor einer SELECT-Abfrage wird beschrieben, wie MySQL die Abfrage ausführen möchte und wie viele Zeilen verarbeitet werden müssen, bevor sie abgeschlossen ist.
Es gibt viele MySQL-Optimierer, die Sie führen können.
Hilfe das hilft
quelle
htop
Zeigt aber , dass nur 307MB von 2050MB RAM verwendet werden.name
und 'Vorname' beginnen. Zweitens sind Sie sicher, dass Sie die Indizierung korrekt durchgeführt haben? Möglich_Tasten: NULL Wenn die Spalte NULL ist, bedeutet dies, dass keine relevanten Indizes gefunden wurden.