Jeśli masz głównie tabele MyISAM, powinieneś zwiększyć bufor wstawiania zbiorczego . Oto, co mówi Dokumentacja MySQL na temat ustawiania rozmiaru_wystąpienia_wstaw :
MyISAM wykorzystuje specjalną pamięć podręczną podobną do drzewa, aby przyspieszyć wstawianie zbiorcze dla WSTAW ... WYBIERZ, WSTAW ... WARTOŚCI (...), (...), ... i ZAŁADUJ DANE INFILE podczas dodawania danych do niepustych stoły Ta zmienna ogranicza rozmiar drzewa pamięci podręcznej w bajtach na wątek. Ustawienie na 0 wyłącza tę optymalizację. Wartość domyślna to 8 MB.
Musisz zrobić dwie rzeczy
1) Dodaj go do /etc/my.cnf
[mysqld]
bulk_insert_buffer_size=512M
2) Ustaw dla niego globalną wartość
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
Jeśli nie masz uprawnień do globalnego ustawiania wielkości luzem_wstaw_buforu, zrób to
service mysql restart
Oczywiście nie dotyczy to InnoDB.
Z innego punktu widzenia, niezależnie od tego, czy tabele to InnoDB czy MyISAM, jeśli indeksy są większe niż tabela, możesz mieć zbyt wiele indeksów. Zwykle witam gości, że ponowne załadowanie Myysam mysqldump powinno zająć 3 razy więcej czasu niż samo wykonanie mysqldump. Witam również, że ponowne załadowanie mysqldump InnoDB powinno zająć 4 razy więcej czasu niż wykonanie mysqldump.
Jeśli przekraczasz współczynnik 4: 1 w celu przeładowania mysqldump, na pewno masz jeden z dwóch problemów:
- za dużo indeksów
- indeksy są zbyt duże z powodu dużych kolumn
Możesz zmierzyć rozmiar swoich danych za pomocą silnika pamięci za pomocą tego:
SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;
Sprawdź, czy indeksy są prawie tak duże jak dane, czy nawet większe
Możesz również rozważyć wyłączenie rejestrowania binarnego w następujący sposób:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
przed ponownym załadowaniem skryptu