Sie müssen Ihren Ansatz auf jeden Fall basierend auf dem Engine-Typ auswählen... bulk-data-loading.html">für MyISAM oder für InnoDB .
Wir haben kürzlich einen Benchmark durchgeführt, bei dem verschiedene Möglichkeiten zum Einfügen von Daten verglichen und die Zeit vor dem Einfügen bis zur vollständigen Wiederherstellung aller Indizes gemessen wurden. Es war auf einer leeren Tabelle, aber wir haben bis zu 10 Millionen Zeilen verwendet.
MyISAM mit LOAD DATA INFILE
und ALTER TABLE ... ENABLE/DISABLE KEYS
hat in unserem Test eindeutig gewonnen (auf einem Windows 7-System, MySQL 5.5.27 - jetzt versuchen wir es auf einem Linux-System).
ENABLE und DISABLE KEYS funktionieren nicht für InnoDB, es ist nur MyISAM. Verwenden Sie für InnoDB SET AUTOCOMMIT = 0; SET FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;
wenn Sie sicher sind, dass Ihre Daten keine Duplikate enthalten (vergessen Sie nicht, sie auf 1
zu setzen nachdem der Upload abgeschlossen ist).
Ich glaube nicht, dass Sie OPTIMIZE TABLE
brauchen nach einer Masseneinfügung - MySQL-Zeilen werden nach Einfügung sortiert und der Index wird trotzdem neu erstellt. Es gibt keine "zusätzliche Fragmentierung" durch eine Masseneinfügung.
Fühlen Sie sich frei, zu kommentieren, wenn ich sachliche Fehler gemacht habe.
AKTUALISIERUNG: Gemäß unseren neueren und vollständigen Testergebnissen ist der Ratschlag zum DEAKTIVIEREN / AKTIVIEREN von Tasten falsch.
Ein Kollege ließ ein Programm mehrere verschiedene Tests ausführen - eine Tabelle mit InnoDB / MyISAM vorbelegt und leer, Auswahl- und Einfügungsgeschwindigkeiten mit LOAD DATA LOCAL
, INSERT INTO
, REPLACE INTO
und UPDATE
, auf "dichten" und "fragmentierten" Tabellen (ich bin mir nicht ganz sicher, wie, ich denke, es war in etwa so wie DELETE FROM ... ORDER BY RAND() LIMIT ...
mit einem festen Seed, damit es immer noch vergleichbar ist) und aktivierte und deaktivierte Indizes.
Wir haben es mit vielen verschiedenen MySQL-Versionen (5.0.27, 5.0.96, 5.1.something, 5.5.27, 5.6.2) unter Windows und Linux getestet (allerdings nicht die gleichen Versionen auf beiden Betriebssystemen). MyISAM hat nur gewonnen, wenn der Tisch leer war. InnoDB war schneller, wenn bereits Daten vorhanden waren, und schnitt im Allgemeinen besser ab (mit Ausnahme des Festplattenspeichers – MyISAM ist auf der Festplatte kleiner).
Um wirklich davon zu profitieren, müssen Sie es jedoch selbst testen - mit verschiedenen Versionen, verschiedenen Konfigurationseinstellungen und viel Geduld - insbesondere hinsichtlich seltsamer Ungereimtheiten (5.0.97 war viel schneller als 5.5.27 mit derselben Konfiguration - wir suche noch nach der Ursache). Was wir gefunden haben, war dass DISABLE KEYS
und ENABLE KEYS
sind so gut wie wertlos und manchmal schädlich, wenn Sie nicht mit einem leeren Tisch beginnen.