Ładuję plik 100 GB przez LOAD DATA INFILE. Miałem dobry sukces z MyISAM, kilka godzin i skończyłem.
Próbuję teraz, używając InnoDB. Ładowanie rozpoczyna się szybko przy prędkości ponad 10 MB / s (obserwowanie wzrostu pliku tabeli file_per_table
jest włączone).
Ale po około 5 GB danych spowalnia do zakresu 2-4 MB / s, a gdy otrzymuję ponad 20 GB, spada o około 2 MB / s.
Rozmiar pul buforów InnoDB wynosi 8G. Przed uruchomieniem polecenia LOAD DATA INFILE wykonałem następujące czynności:
SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....
Nie widzę powodu, dla którego zaczyna się dobrze i zwalnia.
Ponadto, używając tych samych ustawień, uruchomiłem to samo polecenie LOAD DATA INFILE z tabelą przy użyciu InnoDB i MyISAM oraz testowym zestawem danych 5 GB, MyISAM był 20 razy szybszy:
InnoDB:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
MyISAM:
mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886 Deleted: 0 Skipped: 0 Warnings: 6
Coś jeszcze powinienem rozważyć? Silnik MyISAM jest w stanie znacznie lepiej utrzymać szybkość ładowania.
Dodatkowe Szczegóły:
Próbowałem ładować pliki indywidualnie, bez różnicy.
Nawiasem mówiąc, mam 150 plików po 500 MB każdy, w każdym pliku klucze są posortowane.
Po uzyskaniu 40 GB w ciągu nocy, 12 godzin później, szybkość ładowania spadła do 0,5 MB / s, co oznacza, że operacja jest praktycznie niemożliwa.
Nie znalazłem żadnych innych odpowiedzi na podobne pytania na innych forach, wydaje mi się, że InnoDB nie obsługuje ładowania dużych ilości danych do tabel o wielkości kilku GB.