Ich bin ein Doktorand, der mit Mondrian OLAP OLAP erforscht. Daher möchte ich beim ersten Laden Daten schneller in InnoDB (MySQL 5.5) einfügen. In dieser Umgebung bin ich der einzige Benutzer, daher denke ich, dass ich lockerere Einstellungen für die Einfügegeschwindigkeit zulassen kann. Im Moment verwende ich die folgenden Techniken.
- deaktivieren
log_bin
- aktivieren
skip-innodb-doublewrite
- gesetzt
transaction_isolation
zuREAD-COMMITTED
oderREAD-UNCOMMITTED
(eigentlichREAD-COMMITED
) - gesetzt
innodb_flush_log_at_trx_commit
zu0
oder2
(eigentlich0
) innodb_buffer_pool_size
auf 5 GB eingestellt (System verfügt über 6 GB RAM)
Gibt es weitere Techniken zum schnelleren Einfügen in InnoDB? Und muss ich ändern innodb_io_read_thread
und innodb_io_write_thread
? Wenn Sie weitere Informationen benötigen, teilen Sie mir dies bitte mit.
innodb_read_io_threads
,innodb_write_io_threads
und `innodb_io_capacity‘.Es gibt ein ganzes Dokument zu Bulk - Laden von Daten in InnoDB gewidmet ist . Die Haupt-Punkte:
SET autocommit=0;...sql import;COMMIT;
Deaktivieren Sie fremde und eindeutige Prüfungen (Sie können nicht alle Indizes vollständig deaktivieren):
Der dritte kann Ihnen helfen oder auch nicht. Ich empfehle daher, diesen Link zu lesen, um zu sehen, wie Sie die Daten anfänglich laden. Wenn Sie beispielsweise die Lasten in mehrere Einfügungen aufteilen, um sie gleichzeitig auszuführen, können Sie den Wert auf jeden Fall auf 2 setzen. Wenn Sie eine große mehrzeilige Einfügung ausführen, wird dies nicht viel (wenn überhaupt) bewirken Hilfe.
Da Sie das Binärprotokoll für diese erste Einfügung deaktivieren, sollten Sie sich nicht um die Lücken in den automatischen Inkrementierungsnummern kümmern (wenn Sie gleichzeitig Einfügungen durchführen).
quelle
Sie können die folgenden Methoden verwenden, um Einfügungen zu beschleunigen:
INSERT
Anweisungen mit mehrerenVALUES
Listen, um mehrere Zeilen gleichzeitig einzufügen. Dies ist erheblich schneller (in einigen Fällen um ein Vielfaches schneller) als die Verwendung separater einzeiligerINSERT
Anweisungen. Wenn Sie einer nicht leeren Tabelle Daten hinzufügen, können Sie die Variable batch_insert_buffer_size optimieren, um das Einfügen von Daten noch schneller zu machen.LOAD DATA INFILE
. Dies ist normalerweise 20-mal schneller als die Verwendung vonINSERT
Anweisungen. Sehenquelle
Plan A: "Batch" INSERTs - mehrere Zeilen pro INSERT-Anweisung. Schlagen Sie ungefähr 1000 Zeilen pro Anweisung vor. autocommit = on, kein explizites BEGIN ... COMMIT
Plan B: DATEN LADEN
Wenn Sie zu viele Zeilen gleichzeitig einfügen, muss InnoDB mehr Arbeit leisten, um die Einfügung bei einem Absturz zurücksetzen zu können. Aus diesem Grund bin ich mit autocommit = off nicht einverstanden, wodurch der gesamte Satz in einer einzigen Transaktion zusammengefasst würde.
LOAD DATA des gesamten Satzes von Zeilen hätte möglicherweise das gleiche Problem, ist aber recht schnell.
buffer_pool = 5G von 6G stehen kurz davor, zu groß zu werden. Wenn getauscht wird, sinkt die Leistung.
Eine Partitionierung würde es wahrscheinlich langsamer machen.
SHOW CREATE TABLE - Sekundärschlüssel können ein ernstes Handicap sein.
Verwenden Sie InnoDB? oder XtraDB?
quelle
LOAD DATA
Sieht so schnell aus, aber wir müssen Daten sofort als CSV in Text schreiben und dannLOAD DATA
richtig verwenden? / Ich werde dasbuffer_pool_size
auf 4 GB einstellen .