Mysql
 sql >> Base de données >  >> RDS >> Mysql

Besoin d'insérer 100000 lignes dans mysql en utilisant hibernate en moins de 5 secondes

Après avoir essayé toutes les solutions possibles j'ai enfin trouvé une solution pour insérer 100 000 lignes en moins de 5 secondes !

Choses que j'ai essayé :

1) Remplacement des identifiants AUTOINCREMENT/GENERATED d'hibernate/database par des identifiants auto-générés à l'aide d'AtomicInteger

2) Activer batch_inserts avec batch_size=50

3) Vider le cache après chaque nombre "batch_size" d'appels persist()

4) multithreading (n'a pas essayé celui-ci)

Enfin, ce qui a fonctionné, c'est d'utiliser une requête multi-insertion native et insérer 1000 lignes dans une requête d'insertion sql au lieu d'utiliser persist() sur chaque entité. Pour insérer 100 000 entités, je crée une requête native comme celle-ci "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)" [1000 insertions de ligne dans une requête d'insertion sql]

Maintenant, il faut environ 3 secondes pour insérer 100 000 enregistrements ! Le goulot d'étranglement était donc l'orm lui-même ! Pour les insertions en bloc, la seule chose qui semble fonctionner, ce sont les requêtes d'insertion natives !