mysql dump importuje niesamowicie wolno na maszynie mojego programisty

22

Mam zrzut SQL, jest dość duży (411 MB) i zaimportowanie go na serwerze A zajęło 10 minut, ten sam import na mojej stacji roboczej B ma szacunkową ocenę (pipeviewer) na 8 godzin (zaimportowano 31 MB w 40 minut ) Więc jest to współczynnik 53 wolniejszy.

Dane techniczne:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

Konfiguracja mysql / maria jest konfiguracją standardową.

Wczoraj przestawiłem się na MariaDB na mojej stacji roboczej - ale przed MariaDB statystyki były jeszcze gorsze.

Usunąłem już wszystkie bazy danych na stacji roboczej - bez różnicy.

Główne pytanie brzmi: w jaki sposób wydajność może być wolniejsza od współczynnika 53? Nie mogę tak pracować :-(

Moje polecenie importowania:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

serwer A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

stacja robocza B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

serwer A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

stacja robocza B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
Alex
źródło
Czy możesz opisać mi, jak chcesz zaimportować bazę danych? (jaka jest konkretna instrukcja mysql) Co oznacza „show list procesów”; mówić? Czy patrzyłeś, co proces robi z betonem? Czy możesz również sprawdzić, czy Twoja maszyna się zamienia?
Zredagowałem moje pytanie.
Alex
InnoDB? Jaka jest wartość innodb_buffer_pool_sizena każdym komputerze?
Rick James

Odpowiedzi:

47

Ta odpowiedź bardzo przyspieszyła wszystko:

/programming//a/2167641/292408

ja po prostu

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

na początku i

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

na końcu.

Teraz zajęło to 3 minuty.

(Dzięki uprzejmości @andreasemer za pośrednictwem Twittera)

Alex
źródło
Niesamowite sztuczki. Coś, co muszę wiedzieć, czy są jakieś skutki uboczne robienia tego?
Dharma Saputra
1
W przypadku uszkodzenia danych ograniczenia klucza obcego mogą nie zostać spełnione po imporcie.
Alex
Świetna robota. Zaoszczędziłeś mi dosłownie godziny.
Jafo
Nie przyspieszyłem wydajności. Bez tego było 23 minuty, a potem 23 minuty (plik .sql 3 GB).
Joshua Pinter,
5

Uzupełnienie tego, co widzę powyżej ... Mam już plik zrzutu automatycznie wygenerowany przez coś takiego:

mysqldump my_db > db-dump-file.sql

Chcę zautomatyzować ten import więc stworzyłem dwa pliki w moim komputerze zwanych default-start-import.sqla default-end-import.sqli ich zawartość są domyślny start-import.sql :

SET autocommit=0;

i default-end-import.sql :

COMMIT;
SET autocommit=1;

a skrypt, który uruchamiam, jest mniej więcej taki;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

to samo polecenie, ale łatwiejsze do odczytania:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

W takim przypadku catsłuży do łączenia tych plików przed wysłaniem ich do potoku. Myślę, że ważne jest, aby wszystkie pliki kończyły się znakiem nowej linii (pusta linia na końcu pliku, jeśli widziane z edytora tekstu), aby catpolecenie nie łączyło linii między plikami.

Import działa dobrze, nie przetestowałem, czy jest faktycznie szybszy z powodu tego ulepszenia w włączaniu i wyłączaniu automatycznego zatwierdzania, ale jeśli to przyspiesza, to dodatkowe kroki ułatwiają.

santiago arizti
źródło
1

próbowałem --compress równie dobrze, SET autocommit=0;a oni pomogli w niewielkiej ilości, jednak ...

Przekonałem się, że konwersja wielu INSERT INTO ... instrukcji w jedną dużą instrukcję z wieloma VALUES(...), (...)poprawionymi prędkościami znacznie.

używam mysql przez SSL przez WAN. Zdalna baza danych MySQL jest hostowana na Amazon.

Z 9 kolumnami i 2100 wierszami:

  • 2100 oddzielnych INSERTstwierdzeń: 82s
  • 2 skonsolidowane INSERTsprawozdania: <1s

Z 7 kolumnami i 42 000 wierszami:

  • 42 000 oddzielnych INSERTzestawień: 1740
  • 42 skonsolidowane INSERTsprawozdanie: 105s

Tak więc w zależności od narzędzia generującego zrzut bazy danych (a dokładniej formatu INSERT instrukcji) można wpłynąć na szybkość.

Uwaga: Zmniejsza to również.sql plik zrzutu o ponad 60% w moich testach, więc oszczędza również na we / wy.

Ostrzeżenie: istnieją fizyczne ograniczenia tej techniki zimysql dla osób wymagających przenośności ... SQL Server wydaje się być ograniczony tylko do 1000 wierszy jednocześnie.

Mimo to wykonanie 1000 wierszy naraz dla 42 000 wierszy wciąż daje poprawę o 1,657%!

tresf
źródło