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.

Marklar
źródło