Ich habe ein Programm in C geschrieben, um große XML-Dateien zu analysieren und dann mit insert-Anweisungen Dateien zu erstellen. Ein anderer Prozess würde die Dateien in eine MySQL-Datenbank aufnehmen. Diese Daten dienen als Indexierungsdienst, damit Benutzer Dokumente leicht finden können.
Ich habe InnoDB für die Möglichkeit der Sperrung auf Zeilenebene ausgewählt. Das C-Programm wird jedes wo von 500 bis 5 Millionen Insert-Anweisungen für einen bestimmten Aufruf generieren.
Was ist der beste Weg, um alle diese Daten so schnell wie möglich in die Datenbank zu bekommen? Die andere Sache zu beachten ist, dass die Datenbank auf einem separaten Server ist. Lohnt es sich, die Dateien auf diesen Server zu verschieben, um Einfügungen zu beschleunigen?
EDIT: Diese Tabelle wird nicht wirklich aktualisiert, aber Zeilen werden gelöscht.
Ich würde zumindest diese Dinge nach diesem Link tun:
MySQL mit den Standardtabellenformaten ist wunderbar schnell, solange es eine schreibgeschützte Tabelle ist; Die erste Frage ist also, ob Sie aktualisieren oder löschen werden. Wenn nicht, gehen Sie nicht mit innosys - es gibt keine Notwendigkeit zum Sperren, wenn Sie nur anhängen. Sie können die Ausgabedatei in regelmäßigen Abständen abschneiden oder umbenennen, um mit der Tabellengröße fertig zu werden.
Transaktionen eliminieren das
INSERT, SYNC-TO-DISK
Wiederholungsphase und stattdessen wird die gesamte Datenträger-IO ausgeführt, wenn Sie die Transaktion COMMIT.
Rohtext + GZip komprimierter Stream ~ = in manchen Fällen bis zu 90% Bandbreiteneinsparung.
(Weniger zu sendender Text, kürzere Aktion)
Kommt wirklich auf den Motor an. Wenn Sie InnoDB verwenden, verwenden Sie Transaktionen (Sie können sie nicht vermeiden - aber wenn Sie autocommit verwenden, ist jeder Stapel implizit in einem eigenen txn), aber stellen Sie sicher, dass sie weder zu groß noch zu klein sind.
>Wenn Sie MyISAM verwenden, sind Transaktionen bedeutungslos. Sie können eine bessere Geschwindigkeit beim Einfügen erreichen, indem Sie Indizes deaktivieren und aktivieren, aber das ist nur gut für eine leere Tabelle.
Wenn Sie mit einem leeren Tisch beginnen, ist das im Allgemeinen am besten.
LOAD DATA ist wie immer ein Gewinner.
Tags und Links mysql performance insert load-data-infile