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
źródło
innodb_buffer_pool_size
na każdym komputerze?Odpowiedzi:
Ta odpowiedź bardzo przyspieszyła wszystko:
/programming//a/2167641/292408
ja po prostu
na początku i
na końcu.
Teraz zajęło to 3 minuty.
(Dzięki uprzejmości @andreasemer za pośrednictwem Twittera)
źródło
Uzupełnienie tego, co widzę powyżej ... Mam już plik zrzutu automatycznie wygenerowany przez coś takiego:
Chcę zautomatyzować ten import więc stworzyłem dwa pliki w moim komputerze zwanych
default-start-import.sql
adefault-end-import.sql
i ich zawartość są domyślny start-import.sql :i default-end-import.sql :
a skrypt, który uruchamiam, jest mniej więcej taki;
to samo polecenie, ale łatwiejsze do odczytania:
W takim przypadku
cat
sł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), abycat
polecenie 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ą.
źródło
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 wielomaVALUES(...), (...)
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:
INSERT
stwierdzeń: 82sINSERT
sprawozdania: <1sZ 7 kolumnami i 42 000 wierszami:
INSERT
zestawień: 1740INSERT
sprawozdanie: 105sTak 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 zi
mysql
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%!
źródło