Was ist der beste Weg, schnelle Einfügungen großer Datenmengen in MySQL zu erreichen?

8

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.

    
Chris Kloberdanz 24.11.2008, 16:05
quelle

6 Antworten

15
  • Verwenden Sie das Tool mysqlimport oder den Befehl LOAD DATA INFILE.
  • Deaktivieren Sie vorübergehend Indizes, die Sie für die Datenintegrität nicht benötigen
activout.se 24.11.2008, 16:13
quelle
2

Ich würde zumindest diese Dinge nach diesem Link tun:

  1. Verschieben Sie die Dateien dorthin und verbinden Sie sie über den Unix-Socket
  2. Erzeugen Sie anstelle der INSERTS eine LOAD DATA INFILE Datei
  3. Deaktivieren von Indizes beim Laden
Vinko Vrsalovic 24.11.2008 16:13
quelle
1

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.

    
dkretz 24.11.2008 16:13
quelle
1

1. Stellen Sie sicher, dass Sie eine Transaktion verwenden.

Transaktionen eliminieren das

INSERT, SYNC-TO-DISK

Wiederholungsphase und stattdessen wird die gesamte Datenträger-IO ausgeführt, wenn Sie die Transaktion COMMIT.

2. Stellen Sie sicher, dass Sie die Verbindungskomprimierung verwenden

Rohtext + GZip komprimierter Stream ~ = in manchen Fällen bis zu 90% Bandbreiteneinsparung.

3. Verwenden Sie möglichst die parallele Einfüge-Notation

%Vor%

(Weniger zu sendender Text, kürzere Aktion)

    
Kent Fredric 24.11.2008 16:15
quelle
1

Wenn Sie LOAD DATA INFILE nicht verwenden können, wie es andere vorgeschlagen haben, verwenden Sie vorbereitete Abfragen für Einfügungen.

    
Powerlord 24.11.2008 16:29
quelle
1

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.

    
MarkR 24.11.2008 16:51
quelle