Ich habe ein Problem, bei dem mehrere MySQL-Updates gleichzeitig ausgeführt werden und einige Minuten dauern. Ich verwende InnoDB, daher bin ich verwirrt, warum dies passieren könnte, da bei jedem Update nur eine Zeile aktualisiert wird. Ich verwende auch eine m2.4xlarge RDS-Instanz (die größte, die sie kommen).
Folgendes mache ich: Ich habe eine Tabelle mit ungefähr 100 Millionen Zeilen, wobei "Ansichten" eine Spalte (die indiziert ist) ist, und ich möchte die Ansichten für ungefähr 1 Million Zeilen aktualisieren. Auf mehreren verschiedenen Servern habe ich eine Schleife wie diese, in der jeder Server seine eigenen zu aktualisierenden Zeilen hat (Pseudocode):
mysql("set autocommit=0");
mysql("start transaction");
foreach($rows as $row) {
mysql("update table set views=views+1 where id=$row[id]");
}
mysql("commit");
Dadurch werden alle Zeilen durchlaufen, die aktualisiert werden müssen. Es funktioniert perfekt, wenn die Anzahl der Server gering ist, wie etwa 4, aber wenn es auf 10+ ansteigt, hängen die Updates auf einmal im Status "Aktualisieren". Nichts sagt, dass es auf ein Schloss wartet, es ist nur "Aktualisieren". Dies geschieht für ungefähr 5 Minuten, wo es schließlich die Aktualisierungen vornimmt und die Schleife durchläuft und schließlich wieder passiert.
Ich suche nicht nach alternativen Möglichkeiten, um die Updates durchzuführen. Dinge wie eine tmp-Tabelle haben und
update table,tmp_table set table.views = table.views+tmp_table.views where
table.id = tmp_table.id
Sperren Sie alle Zeilen, die aktualisiert werden, bis sie alle fertig sind (dies können Stunden sein), was für mich nicht funktioniert. Sie müssen in diesen schrecklichen Schleifen sein.
Ich frage mich, warum sie im Status "Aktualisieren" stecken bleiben könnten und was ich tun kann, um dies zu verhindern.
tldr; Wenn mehr als 10 "Aktualisierungs" -Schleifen vorhanden sind, werden schließlich alle Aktualisierungen gleichzeitig aus einem unbekannten Grund gesperrt, bis sie sich entschließen, endgültig Aktualisierungen vorzunehmen und die Schleifen zu durchlaufen, damit sie Sekunden später erneut ausgeführt werden.
VARIABLEN ANZEIGEN: http://pastebin.com/NdmAeJrz
SHOW ENGINE INNODB STATUS: http://pastebin.com/Ubwu4F1h