IN (SELECT ...)
ist schlecht optimiert. (Ich kann keine Einzelheiten angeben, da sowohl UPDATE
als auch IN
in einigen neueren Versionen von MySQL besser optimiert wurden.) Es genügt zu sagen: "vermeiden Sie IN (SELECT ...)
".
Ihr erster Satz sollte "Zeilen" anstelle von "Spalten" sagen.
Zurück zum Rest der Frage. 60K ist zu groß von einem Stück. Ich empfehle nur 1000. Abgesehen davon ist Gordons Antwort wahrscheinlich die beste.
Aber ... Sie haben OFFSET
nicht verwendet; Do nicht versucht sein, es zu verwenden; Es wird die Leistung töten, wenn Sie weiter und weiter in den Tisch gehen.
Eine andere Sache. COMMIT
nach jedem Stück. Sonst baut man ein riesiges Undo-Log auf; Dies trägt zu den Kosten bei. (Und ist ein Grund, warum 1K möglicherweise schneller als 60K ist.)
Aber warte! Warum aktualisierst du einen riesigen Tisch? Das ist in der Regel ein Zeichen für schlechtes Schema-Design. Bitte erläutern Sie den Datenfluss.
Vielleicht haben Sie berechnet, welche Elemente als 'prime' markiert werden sollen? Nun, Sie könnten diese Liste herum behalten und JOINs
in der SELECTs
machen, um Prime-Ness beim Lesen zu entdecken. Dies beseitigt vollständig die UPDATE
in Frage. Sicher, die JOIN
kostet etwas, aber nicht viel.
Wenn Sie es gemessen haben, welche Ergebnisse haben Sie bekommen? –
Der zweite Ansatz dauerte weniger Zeit. Aber ich versuche den Grund dafür herauszufinden. –
Das liegt daran, dass die erste Abfrage ausreichend Speicher für Ihren innodb-Pufferpool benötigt, damit sie schnell ausgeführt werden kann. Zweitens werden Einzeltransaktionsanfragen vergleichsweise weniger Zeit benötigen. – Nans