Zasadniczo moim problemem jest to, że mam dużą tabelę około 17 000 000 produktów, do których muszę bardzo szybko zastosować kilka aktualizacji.
Tabela ma 30 kolumn z identyfikatorem ustawionym jako int (10) AUTO_INCREMENT.
Mam inną tabelę, w której są przechowywane wszystkie aktualizacje tej tabeli. Te aktualizacje muszą zostać wstępnie obliczone, ponieważ ich obliczenie zajmuje kilka dni. Ta tabela jest w formacie [product_id int (10), update_value int (10)].
Strategią, którą stosuję, aby szybko wydać te 17 milionów aktualizacji, jest załadowanie wszystkich tych aktualizacji do pamięci w skrypcie ruby i zgrupowanie ich w tablicy tablic, tak aby każda wartość aktualizacji była kluczem, a każda tablica była listą posortowanych identyfikatorów produktu .
{
150: => [1,2,3,4,5,6],
160: => [7,8,9,10]
}
Aktualizacje są następnie wydawane w formacie
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);
Jestem prawie pewien, że robię to poprawnie w tym sensie, że wydawanie aktualizacji dla posortowanych partii identyfikatorów produktu powinno być optymalnym sposobem na zrobienie tego za pomocą mysql / innodb.
Mam do czynienia z dziwnym problemem, gdy podczas testowania z aktualizacją ~ 13 milionów rekordów zajęło to tylko około 45 minut. Teraz testuję z większą ilością danych, około 17 milionów rekordów, a aktualizacje trwają blisko 120 minut. Spodziewałbym się tutaj pewnego rodzaju zmniejszenia prędkości, ale nie w takim stopniu, jaki widzę.
Wszelkie porady na temat tego, jak mogę to przyspieszyć lub co może mnie spowolnić dzięki temu większemu zestawowi rekordów?
Jeśli chodzi o specyfikacje serwerów, są całkiem niezłe, mnóstwo pamięci / procesora, cała baza danych powinna zmieścić się w pamięci z dużą ilością miejsca do powiększenia.