Vorher kam ein Entwickler zu mir und sagte, dass die Abfrage einer bestimmten Funktion der Anwendung viel langsamer sei als zuvor. Ich bat den Entwickler, eine langsame SQL-Anweisung bereitzustellen, und ging zu Überprüfen Sie den Ausführungsplan in der entsprechenden MySQL-Datenbank. Wenn festgestellt wird, dass der Ausführungsplan falsch ist, besteht die erste Reaktion darin, dass die statistischen Informationen einer der Tabellen ungenau sind, was dazu führt, dass sich der Ausführungsplan der SQL-Anweisung ändert von effizientem Abfrage-SQL zu langsamem SQL. Nachdem ich das Problem lokalisiert hatte, war es selbstverständlich, die Informationen erneut zu analysieren und zu sammeln. Zu diesem Zeitpunkt stellte ich fest, dass alle Auswahlen in der Analysetabelle plötzlich hängen blieben und keine Ergebnisse lieferten. Dann explodierte die Anwendung mit verschiedenen Alarmmeldungen.
Der Analysevorgang wurde für eine Slave-Bibliothek durchgeführt, und die betroffene war im Grunde eine Auswahlabfrage. Was hier also simuliert wird, ist ein Abfragevorgang.
Erstellen Sie eine Simulationstabelle
mysql> select * from t_test_1; +----+--------+-------+--------+ | id | name | name2 | status | +----+--------+-------+--------+ | 1 | name1 | 1001 | 0 | | 2 | name1 | 1002 | 1 | | 3 | name1 | 1003 | 1 | | 4 | name1 | 1004 | 0 | | 5 | name1 | 1005 | 1 | | 6 | name1 | 1006 | 0 | | 7 | name1 | 1007 | 2 | | 8 | name1 | 1008 | 0 | | 9 | name1 | 1009 | 1 | | 10 | name10 | 1001 | 0 | +----+--------+-------+--------+ 10 rows in set (0.00 sec)复制代码
Simulieren Sie langsame Abfragen. Da die Datenmenge hier nicht ausreicht, wird stattdessen Schlaf verwendet Sitzung1: Langsame Abfrage simulieren In den Sitzungsinformationen können Sie sehen, dass der Status von zwei Sitzungen „Warten auf Tabellenlöschung“ lautet.
Warten auf den Grund für die Tabellenlöschung
Wenn die MySQL-Datenbank Vorgänge wie FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPARATUR TABLE, ANALYZE TABLE oder OPTIMIZE TABLE ausführt, führt dies dazu, dass die Tabelle im Speicher geschlossen werden muss Öffnen Sie die Tabelle erneut. Laden Sie die neue Tabellenstruktur in den Speicher. Beim Schließen einer Tabelle muss jedoch darauf gewartet werden, dass alle Vorgänge für die Tabelle beendet sind (einschließlich Auswählen, Einfügen, Aktualisieren, Sperren der Tabelle usw.). Wenn also eine besonders langsame Auswahl ausgeführt wird, wird der Befehl „Tabelle analysieren“ nie beendet.
Lösung
Da wir nun wissen, was „Warten auf Tabellenlöschung“ verursacht, beginnen wir mit der Suche nach langsamen SQL-Anweisungen. Hier können Sie sehen, dass wir die Tabelle t_test_1 erfassen. Daher müssen wir eine langsame Abfrage mit der Tabelle t_test_1 abfragen, und die Ausführungszeit ist länger als die Ausführungszeit der Analysetabelle t_test_1.
mysql> select sleep(1000) from t_test_1;复制代码
mysql> analyze table t_test_1;复制代码
Beenden Sie die Sitzung und der Fehler ist behoben .
Vorschläge für die Produktionsausführungsanalysetabelle 1. Schätzen Sie vor der Ausführung das Datenvolumen der Tabelle und die benötigte Zeit anhand Ihrer Erfahrung ab. Überprüfen Sie gleichzeitig, ob eine langsame SQL vorhanden ist, die die Informationstabelle sammelt, und ob lange Transaktionen ausgeführt werden.
2. Vermeiden Sie die Ausführung einer Tabellenanalyse, um während der Hauptgeschäftszeiten statistische Informationen zu sammeln.
(Video)
Das obige ist der detaillierte Inhalt vonDie MySQL-Datenbank führt eine Analyse durch, um Informationen zu sammeln. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!