Wenn Sie in erster Linie MyISAM - Tabellen haben, sollten Sie die Erhöhung Bulk Insert - Puffer . Folgendes steht in der MySQL-Dokumentation zum Festlegen von bulk_insert_buffer_size :
MyISAM verwendet einen speziellen baumartigen Cache, um Masseneinfügungen für INSERT ... SELECT, INSERT ... VALUES (...), (...), ... und LOAD DATA INFILE zu beschleunigen, wenn Daten zu nonempty hinzugefügt werden Tabellen. Diese Variable begrenzt die Größe des Cache-Baums in Bytes pro Thread. Wenn Sie den Wert auf 0 setzen, wird diese Optimierung deaktiviert. Der Standardwert ist 8 MB.
Sie müssen zwei Dinge tun
1) Fügen Sie es zu /etc/my.cnf hinzu
[mysqld]
bulk_insert_buffer_size=512M
2) Stellen Sie den globalen Wert dafür ein
SET GLOBAL bulk_insert_buffer_size = 1024 * 1024 * 512;
Wenn Sie nicht berechtigt sind, bulk_insert_buffer_size global festzulegen, führen Sie dies aus
service mysql restart
Dies gilt natürlich nicht für InnoDB.
Aus einem anderen Blickwinkel, unabhängig davon, ob es sich bei den Tabellen um InnoDB oder MyISAM handelt, können zu viele Indizes vorhanden sein, wenn die Indizes größer als die Tabelle sind. Ich bin normalerweise der Meinung, dass das Neuladen eines MyISAM-MySQL-Speicherauszugs dreimal so lange dauern sollte, wie der MySQL-Speicherauszug benötigt. Ich bin auch der Meinung, dass das Neuladen eines InnoDB-mysqldump viermal so lange dauern sollte, wie der mysqldump benötigt.
Wenn Sie das Verhältnis 4: 1 zum erneuten Laden eines mysqldump überschreiten, haben Sie definitiv eines von zwei Problemen:
- zu viele Indizes
- Indizes sind aufgrund großer Spalten einfach zu groß
Sie können die Größe Ihrer Daten anhand der Speicher-Engine folgendermaßen messen:
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;
Überprüfen Sie, ob die Indizes mindestens so groß wie die Daten sind
Sie können die binäre Protokollierung auch wie folgt deaktivieren:
echo "SET SQL_LOG_BIN=0;" > footable.sql
mysqldump --databases foo >> footable.sql
bevor Sie das Skript neu laden