2010-03-17 17 views
21

Czasami muszę ponownie zaimportować dane do projektu, czytając w ten sposób około 3,6 miliona wierszy do tabeli MySQL (obecnie InnoDB, ale tak naprawdę nie jestem ograniczony do tego silnika). "Load data infile ..." okazało się najszybszym rozwiązaniem, jednak ma kompromis: - podczas importowania bez kluczy, samo importowanie trwa około 45 sekund, ale tworzenie klucza trwa wieki (trwa już 20 minut. ..). - wykonywanie importu za pomocą klawiszy na stole powoduje, że import jest znacznie wolniejszyMySQL ładowanie danych infile - przyspieszenie?

Istnieją klucze nad trzema polami tabeli, odnoszącymi się do pól numerycznych. Czy istnieje sposób na przyspieszenie tego?

Inną kwestią jest: gdy kończę proces, który rozpoczął powolne zapytanie, kontynuuje działanie w bazie danych. Czy istnieje sposób na zakończenie kwerendy bez restartowania mysqld?

Thanks a lot dBA

+0

jak duże są zapisy? – Grumpy

+0

około 60 do 100 bajtów, 5 do 8 pól. Nic tak naprawdę nie jest duże, to ogromna ilość sprawia, że ​​całość jest wolna. – DBa

Odpowiedz

38

Jeśli korzystasz z innodb i ładowanie zbiorcze, oto kilka wskazówek:

posortuj plik CSV w podstawowej kolejności klawiszy tabeli docelowej: pamiętaj, że innodb używa klastrowane klucze główne, dzięki czemu ładują się szybciej, jeśli zostaną posortowane!

typowy plik_we dane obciążenie używam:

truncate <table>; 

set autocommit = 0; 

load data infile <path> into table <table>... 

commit; 

inne optymalizacje można użyć, aby zwiększyć czas ładowania:

set unique_checks = 0; 
set foreign_key_checks = 0; 
set sql_log_bin=0; 

podzielić plik csv na mniejsze kawałki

typowe stats import I zaobserwowałem podczas ładowania zbiorczego:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

Wyłączenie unique_checks poprawiło już wydajność, a także sortowanie według klucza podstawowego. Dzięki! – DBa

1

InnoDB to całkiem niezły silnik. Jednak bardzo zależy od bycia "nastrojonym". Jedną rzeczą jest to, że jeśli twoje wstawki nie są w porządku zwiększania podstawowych kluczy, innoDB może potrwać nieco dłużej niż MyISAM. Można to łatwo pokonać, ustawiając wyższą wartość innodb_buffer_pool_size. Moją sugestią jest ustawienie jej na 60-70% całkowitej pamięci RAM na dedykowanym urządzeniu MySQL.

Powiązane problemy