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 auf1GB
. Erhöhen Sie dies, um10GB
das Problem zu reduzieren.Antworten:
Die MyISAM Storage Engine ist bekannt dafür, dass sie vollständige Tabellensperren für DML (INSERTs, UPDATEs, DELETEs) durchführt. InnoDB würde dieses Problem definitiv langfristig lösen.
Ich schrieb über Vor- und Nachteile der Verwendung von MyISAM vs InnoDB
In Bezug auf Ihre aktuelle Frage ist hier ein mögliches Szenario:
article
undarticle_comments
sind beide MyISAM-Tabellenarticle_comments
hat einen oder mehrere Indizes mitstatus
als Spaltearticle_comments
werden im MyISAM-Schlüsselpuffer (Größe nach key_buffer_size ) zwischengespeichert, wodurch alte Indexseiten aus dem MyISAM-Schlüsselpuffer entfernt werdenarticle
und ausführenarticle_comments
In meinem vorgeschlagenen Szenario können SELECTs für die
article
Tabelle daran gehindert werden, Schreibvorgänge zuzulassen, da darauf gewartet werden mussarticle_comments
, dass sie frei von DML sind (in diesem Fall einUPDATE
).quelle
Riecht, als hättest du einen großen Query_cache?
Bei Produktionssystemen mit vielen Schreibvorgängen können Sie den query_cache auch deaktivieren.
Alle Einträge in der query_cache für die angegebene Tabelle gelöscht werden , wenn jede Schreib auf diese Tabelle auftritt. Je größer die Qualitätskontrolle, desto langsamer ist diese Aufgabe.
MyISAM verwendet Sperren auf Tabellenebene. Lese- und Schreibvorgänge können nicht gleichzeitig (in derselben Tabelle) erfolgen. Roh, aber effektiv.
quelle