sql >> Database >  >> RDS >> Mysql

Tijdbesparende methode nodig om grote CSV-bestanden via PHP in meerdere MySQL-tabellen te importeren

Ik heb PHP-scripts geschreven om de gegevens die zijn gepubliceerd door de Stack Overflow-gegevensdump in bulk te laden. Ik importeer miljoenen rijen en het duurt niet zo lang.

Hier zijn enkele tips:

  • Vertrouw niet op automatisch vastleggen. De overhead van het starten en uitvoeren van een transactie voor elke rij is enorm. Gebruik expliciete transacties en commit na elke 1000 rijen (of meer).

  • Gebruik voorbereide verklaringen. Aangezien je in feite duizenden keren dezelfde inserts doet, kun je elke insert voorbereiden voordat je begint met loopen, en vervolgens uitvoeren tijdens de loop, waarbij je waarden als parameters doorgeeft. Ik weet niet hoe ik dit moet doen met de databasebibliotheek van CodeIgniter, je zult het moeten uitzoeken.

  • Tune MySQL voor importeren. Verhoog de cachebuffers enzovoort. Zie Snelheid van INSERT-statements voor meer informatie.

  • Gebruik DATA INFILE LADEN. Zo mogelijk. Het is letterlijk 20x sneller dan het gebruik van INSERT om gegevens rij voor rij te laden. Ik begrijp het als je dat niet kunt, omdat je de laatste invoeg-ID moet krijgen, enzovoort. Maar in de meeste gevallen, zelfs als u het CSV-bestand leest, het opnieuw rangschikt en wegschrijft naar meerdere tijdelijke CSV-bestanden, is het laden van gegevens nog steeds sneller dan met INSERT.

  • Doe het offline. Voer geen langlopende taken uit tijdens een webverzoek. De tijdslimiet van een PHP-verzoek zal de taak beëindigen, zo niet vandaag dan volgende dinsdag wanneer de taak 10% langer is. Plaats in plaats daarvan het webverzoek in de wachtrij van de taak en geef het beheer vervolgens terug aan de gebruiker. U moet de gegevensimport uitvoeren als een serverproces en de gebruiker regelmatig een glimp van de voortgang laten zien. Een goedkope manier om dit te doen is bijvoorbeeld door uw importscript "." naar een tijdelijk bestand, en dan kan de gebruiker vragen om het tijdelijke bestand te bekijken en te blijven herladen in zijn browser. Als je zin hebt, doe dan iets met Ajax.



  1. Hoe toon ik lopende processen in Oracle DB?

  2. SYSUTCDATETIME() versus GETUTCDATE() in SQL Server:wat is het verschil?

  3. MySQL Hoe INSERT u IN EEN tabel met een SELECT-subquery die meerdere rijen retourneert?

  4. Snelste manier om grote CSV-bestanden in MySql te importeren met MySql CLI