
Mein Problem besteht im Wesentlichen darin, dass ich eine große Tabelle mit etwa 17.000.000 Produkten habe, auf die ich sehr schnell eine Reihe von Aktualisierungen anwenden muss.
Die Tabelle hat 30 Spalten mit der ID int(10) AUTO_INCREMENT.
Ich habe eine weitere Tabelle, in der alle Aktualisierungen für diese Tabelle gespeichert sind. Diese Aktualisierungen müssen vorab berechnet werden, da ihre Berechnung einige Tage dauert. Diese Tabelle hat das Format [ product_id int(10), update_value int(10) ].
Die Strategie, die ich verfolge, um diese 17 Millionen Updates schnell herauszugeben, besteht darin, alle diese Updates in einem Ruby-Skript in den Speicher zu laden und sie in einem Hash von Arrays zu gruppieren, sodass jeder Update-Wert ein Schlüssel und jedes Array eine Liste sortierter Produkt-IDs ist.
{
150: => [1,2,3,4,5,6],
160: => [7,8,9,10]
}
Die Aktualisierungen erfolgen dann im Format
UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);
Ich bin ziemlich sicher, dass ich es in dem Sinne richtig mache, dass die Ausgabe der Updates für sortierte Stapel von Produkt-IDs die optimale Vorgehensweise mit MySQL/InnoDB sein sollte.
Ich stoße jedoch auf ein seltsames Problem: Als ich beim Testen die Aktualisierung von ca. 13 Millionen Datensätzen durchführte, dauerte dies nur etwa 45 Minuten. Jetzt teste ich mit mehr Daten, ca. 17 Millionen Datensätzen, und die Aktualisierungen dauern fast 120 Minuten. Ich hätte hier eine Art Geschwindigkeitsabnahme erwartet, aber nicht in dem Ausmaß, das ich sehe.
Irgendwelche Ratschläge, wie ich dies beschleunigen kann oder was mich bei diesem größeren Datensatz verlangsamen könnte?
Was die Serverspezifikationen angeht, sind sie ziemlich gut, jede Menge Speicher/CPU, die gesamte Datenbank sollte in den Speicher passen, mit viel Raum zum Wachsen.