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.