sql >> Databasteknik >  >> RDS >> Mysql

Behöver infoga 100 000 rader i mysql med viloläge på under 5 sekunder

Efter att ha provat alla möjliga lösningar hittade jag äntligen en lösning för att infoga 100 000 rader under 5 sekunder!

Saker jag försökte:

1) Ersatte hibernate/databasens AUTOINCREMENT/GENERATED ID:n med egengenererade ID:n med AtomicInteger

2) Aktivera batch_inserts med batch_size=50

3) Tömning av cache efter varje 'batch_size' antal persist()-anrop

4) multithreading (försökte inte den här)

Det som slutligen fungerade var att använda en native multi-sert query och infoga 1000 rader i en sql insert-fråga istället för att använda persist() på varje enhet. För att infoga 100 000 entiteter skapar jag en inbyggd fråga som denna "INSERT into MyTable VALUES (x,x,x),(x,x,x).......(x,x,x)" [1000 radinfogningar i en sql-infogningsfråga]

Nu tar det cirka 3 sekunder att infoga 100 000 poster! Så flaskhalsen var själva ormen! För massinlägg är det enda som verkar fungera inbyggda infogningsfrågor!



  1. Referera till ett alias någon annanstans i SELECT-listan

  2. Hur man installerar Oracle Linux Automation Manager (aka "Oracle Ansible Tower")

  3. Hur exporterar man bildfält till fil?

  4. Ändra tabell om det finns eller skapa om det inte finns