Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Müssen 100000 Zeilen in MySQL mit Hibernate in weniger als 5 Sekunden einfügen

Nachdem ich alle möglichen Lösungen ausprobiert hatte, fand ich endlich eine Lösung, um 100.000 Zeilen in weniger als 5 Sekunden einzufügen!

Dinge, die ich versucht habe:

1) Hibernate/Datenbank-IDs AUTOINCREMENT/GENERATED durch selbst generierte IDs mit AtomicInteger ersetzt

2) Aktivierung von batch_inserts mit batch_size=50

3) Leeren des Caches nach jeder 'batch_size'-Anzahl von persist()-Aufrufen

4) Multithreading (habe es nicht versucht)

Was schließlich funktionierte, war die Verwendung einer nativen Multi-Insert-Abfrage und Einfügen von 1000 Zeilen in eine SQL-Einfügeabfrage anstelle von persist() auf jeder Entität. Zum Einfügen von 100.000 Entitäten erstelle ich eine native Abfrage wie diese "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)" [1000 Zeileneinfügungen in einer SQL-Einfügungsabfrage]

Jetzt dauert es etwa 3 Sekunden, um 100.000 Datensätze einzufügen! Der Engpass war also das Orm selbst! Bei Masseneinfügungen scheint das Einzige, was zu funktionieren scheint, native Einfügungsabfragen!