Als ich das letzte Mal ein Abstimmungssystem erstellt habe, blieb es während der Spitzenzeit der Aktivität lange Zeit hängen, und die Auswirkung einer vorübergehenden Erhöhung der Bandbreite war nicht offensichtlich.
Gehen Sie zur Analyse auf den Server. Eine große Menge an CPU in oben wird in IO-Wartezeit verbraucht . Alle Anzeichen deuten auf MySQL, langsame Protokollabfragen und Indexstruktur hin, aber ich habe das Gefühl, dass das grundlegende Problem nicht gefunden wurde. Endlich in zeigen Während der Prozessliste wurde eine große Anzahl von Sperrprozessen gefunden. Haha, das Problem ist offensichtlich.
Die Abstimmungstabelle verwendet die Mysiam-Engine. Nachdem die Stimmen gezählt wurden, Update sperrt die TabelleDas ist richtig. Außerdem ist die Serverleistung im Allgemeinen langsam und das Programm führt bei der Verarbeitung der Abstimmungsseite kein asynchrones Downgrade durch. Aber der Schlüsselfaktor wurde immer noch gefunden, es war die MySQL-Sperre.
Wenn also Probleme mit der MySQL-Leistung entdeckt werden, ist SHOW PROCESSLIST immer noch sehr effektiv, um anzuzeigen, welche Threads ausgeführt werden, zum Beispiel:
Die Statusspalteninformationen sind sehr wichtig. Schauen wir uns zunächst die Bedeutung jeder Spalte und dann den allgemeinen Statusstatus an
Die Bedeutung jeder Spalte
1. id: Eine Kennung, die verwendet wird, wenn Sie eine Anweisung beenden möchten, z. B. mysql>
2. Benutzer: Zeigen Sie den aktuellen Benutzer an. Wenn Sie nicht root sind, zeigt dieser Befehl nur die SQL-Anweisungen innerhalb Ihrer Berechtigung an
3. Host: Zeigt an, von welcher IP und welchem Port diese Erklärung gesendet wurde. Dies kann verwendet werden, um den Benutzer zu verfolgen, der die problematische Erklärung abgegeben hat
4. db: Anzeige, mit welchem Prozess dieser Prozess aktuell verbunden ist
5. Befehl: Anzeige der ausgeführte Befehl der aktuellen Verbindung, Normalerweise schlafen, abfragen, verbinden
6. Zeit: Die Dauer Die Einheit dieses Zustands ist Sekunden
7. Zustand: zeigt den Status der SQL-Anweisung unter Verwendung der aktuellen Verbindung an, sehr Wichtige Spalte, Status ist nur eine Anweisung. Ein bestimmter Status während der Ausführung, z. B. eine Abfrage, muss kopiert werden in die tmp-Tabelle, Sortierergebnis, Senden von Daten und andere Zustände können abgeschlossen werden
8. Info: Diese SQL-Anweisung anzeigen Aufgrund der begrenzten Länge werden lange SQL-Anweisungen nicht vollständig angezeigt, sie sind jedoch eine wichtige Grundlage für die Beurteilung von Problemanweisungen
Zustandsanalyse häufiger Zustände
1. Schlaf
bedeutet normalerweise, dass die Ressource nicht freigegeben wurde. Wenn sie über einen Verbindungspool erfolgt, sollte der Ruhezustand innerhalb eines bestimmten Bereichs konstant sein, zum Beispiel:
Die Datenabfragezeit beträgt 0,1 Sekunden und die Netzwerkausgabe dauert etwa 1 Sekunde. Die ursprüngliche Datenverbindung kann in 0,1 Sekunden freigegeben werden, da das Front-End Das Programm führt den Schließvorgang nicht aus und gibt die Ergebnisse nicht direkt aus. Die Ergebnisse werden nicht auf dem Desktop des Benutzers angezeigt. Vorher wurde die Datenbankverbindung im Ruhezustand gehalten
2. Gesperrt
Der Vorgang ist gesperrt Auftreten des Sperrstatus
3. In tmp-Tabelle kopieren
Wenn der Index und die vorhandene Struktur die Abfragebedingungen nicht abdecken können, wird eine temporäre Tabelle erstellt, um die Abfrageanforderungen zu erfüllen, was zu einem enormen E/A-Druck führt Normalerweise wird empfohlen, verwandte Abfragen zu reduzieren oder Abfrageanweisungen in diesem Zustand zu optimieren. Bei anderen Vorgängen kann dies zu einer erheblichen Beeinträchtigung führen dieses Mal
4. Daten senden
Das Senden von Daten ist nicht das Senden von Daten, sondern der Prozess des Abrufens von Daten von der physischen Festplatte. Wenn Sie einen großen Impact-Ergebnissatz haben, müssen Sie diese beim Senden aus verschiedenen Festplattenfragmenten extrahieren Es gibt zu viele Datenverbindungen. Normalerweise ist die Auswirkungsergebnismenge einer bestimmten Abfrage zu groß, das heißt, die Indexelemente der Abfrage sind nicht ausreichend optimiert
5. Ergebnis im Abfrage-Cache speichern
Wenn dieser Zustand häufig auftritt, verwenden Sie Set-Profiling Wenn der Overhead-Anteil im gesamten SQL zu groß ist (auch wenn es sich um einen sehr geringen Overhead handelt, sehen Sie sich den Anteil an), bedeutet dies, dass die Abfrage erfolgt Es gibt viele Cache-Fragmente, um den Abfrage-Cache sofort zu bereinigen.
Die oben genannten Details sind MySQL-Analyse-Show PROCESSLIST Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!