Wir haben ein Problem festgestellt, nachdem wir die Datenbank unseres Kunden auf einen zusätzlichen Server verschoben haben. Dies hätte sich positiv auf die Leistung der Site auswirken sollen, es gibt jedoch ein Problem mit der Tabellensperre in MyISAM. (Ich habe von der Verwendung von InnoDB anstelle von MyISAM gehört, aber wir können den Motor in naher Zukunft nicht ändern.)
Wir könnten es an einer Update-Abfrage erkennen, die ausgeführt wird, wenn ein Moderator einen Kommentar auf der Artikelseite aktiviert. Dies ist der Prozess:
- Update-Abfrage wird verarbeitet
SET status = 1 WHERE id = 5
(Index wird gesetzt) - Die zwischengespeicherten Dateien der Seite werden gelöscht
Zu diesem Zeitpunkt wird die gesamte Seite langsam. Die Datenbank selbst ist minutenlang ausgelastet. Ich habe die Prozessliste einige Male abgerufen und ungefähr 60 Einträge verschiedener Auswahlabfragen gesehen, die sich alle im Status befanden und auf die Sperre auf Tabellenebene warteten .
1. Ich verstehe nicht, warum dieses Update für die Tabelle article_comments
die select-Anweisungen für die Tabelle beeinflussen kann, um auf die article
Sperre auf Tabellenebene zu warten. In der Prozessliste stammten fast alle wartenden Abfragen aus dieser Tabelle. Ich habe über die Tatsache gelesen, dass Aktualisierungen / Einfügungen gegenüber Auswahlen bevorzugt werden und dass dies solche Probleme verursachen kann, aber die Artikeltabelle selbst wird nicht aktualisiert, wenn Kommentare aktiviert werden, sodass die Auswahl nicht warten sollte. Habe ich das falsch verstanden?
2. Gibt es etwas anderes als die Umstellung auf InnoDB, um dieses Verhalten zu verhindern oder zumindest ein besseres Gleichgewicht zu erreichen? Ich bin sehr irritiert über die Tatsache, dass dieses Problem nicht aufgetreten ist, bevor die Datenbank auf den neuen Server verschoben wurde. Ich denke, es gibt einige Fehlkonfigurationen, aber ich weiß nicht, wie ich sie identifizieren soll.
key_buffer_size
eingestellt auf 1GB
. Erhöhen Sie dies, um 10GB
das Problem zu reduzieren.