2010-03-17 10 views
21

manchmal muss ich Daten für ein Projekt neu importieren und lese so ungefähr 3,6 Millionen Zeilen in eine MySQL-Tabelle (derzeit InnoDB, bin aber eigentlich nicht wirklich auf diese Engine beschränkt). "Load data infile ..." hat sich als schnellste Lösung erwiesen, hat aber einen Kompromiss: - beim Import ohne Schlüssel dauert der Import selbst ca. 45 Sekunden, aber die Schlüsselerstellung dauert ewig (läuft schon 20 Minuten). ..). - Importieren mit Schlüsseln auf der Tabelle macht den Import viel langsamerMySQL laden Daten infile - Beschleunigung?

Es gibt Schlüssel über 3 Felder der Tabelle, Verweis auf numerische Felder. Gibt es eine Möglichkeit, dies zu beschleunigen?

Ein anderes Problem ist: Wenn ich den Prozess, der eine langsame Abfrage gestartet hat, beende, läuft es auf der Datenbank weiter. Gibt es eine Möglichkeit, die Abfrage zu beenden, ohne mysqld neu zu starten?

Vielen Dank DBa

+0

Wie groß sind die Datensätze? – Grumpy

+0

etwa 60 bis 100 Bytes, 5 bis 8 Felder. Nichts wirklich Großes, es ist die große Menge, die das Ganze langsam macht. – DBa

Antwort

38

Wenn Sie innodb und Massenladen verwenden, hier ein paar Tipps:

Sortieren Sie Ihre CSV-Datei in die Reihenfolge der Primärschlüssel der Zieltabelle: merken Sie sich innodb verwendet Clustered Primärschlüssel, so dass es schneller geladen wird, wenn es sortiert ist!

typische Belastungsdaten infile i verwenden:

truncate <table>; 

set autocommit = 0; 

load data infile <path> into table <table>... 

commit; 

andere Optimierungen können Sie die Ladezeiten erhöhen verwenden:

set unique_checks = 0; 
set foreign_key_checks = 0; 
set sql_log_bin=0; 

spaltete die CSV-Datei in kleinere Stücke

typische Import-Statistik i haben während Massenlasten beobachtet:

3.5 - 6.5 million rows imported per min 
210 - 400 million rows per hour 
+0

Durch die Deaktivierung von unique_checks wurde die Leistung sowie die Sortierung nach Primärschlüssel bereits verbessert. Danke! – DBa

1

InnoDB ist ein ziemlich guter Motor. Es ist jedoch sehr darauf angewiesen, dass es "abgestimmt" wird. Eine Sache ist, dass innoDB etwas länger dauern kann als MyISAM, wenn Ihre Einfügungen nicht in der Reihenfolge der zunehmenden Primärschlüssel sind. Dies kann leicht durch Einstellen einer höheren innodb_buffer_pool_size überwunden werden. Mein Vorschlag ist es, es auf einem dedizierten MySQL-Rechner auf 60-70% Ihres gesamten RAM zu setzen.