Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Das Festlegen des Werts einer Spalte aller Zeilen ist sehr langsam

In InnoDB update Anweisungen sperren jede Zeile, die sie scannen. Dies bedeutet, dass zum Aktualisieren Ihrer 200 Zeilen 350.000 Sperren auf Zeilenebene erstellt werden müssen, während gleichzeitig eine Rollback-Sperre beibehalten und allen Transaktionen, die den bereits geänderten Wert lesen, der vorherige Wert bereitgestellt wird (da die Transaktion dies nicht ist festgeschrieben und die Änderung ist nicht endgültig)

MyISAM hingegen sperrt die gesamte Tabelle.

Wenn Sie also alle Zeilen aktualisieren müssen, sperren Sie die gesamte Tabelle, und Sie erhalten eine weitaus bessere Leistung (Sie benötigen keine Sperren auf Zeilenebene)

Aber noch besser, geben Sie eine WHERE-Klausel an, wie Sie es getan haben, und InnoDB wird Sperren nur für die übereinstimmenden Zeilen erwerben (sowie einige Lückensperren im Indexbaum, aber das geht über den Bereich der Frage hinaus)