sql >> Database teknologi >  >> RDS >> Mysql

Brug for tidseffektiv metode til at importere stor CSV-fil via PHP til flere MySQL-tabeller

Jeg har skrevet PHP-scripts for at bulk-loade data udgivet af Stack Overflow data dump. Jeg importerer millioner af rækker, og det tager ikke så lang tid.

Her er nogle tips:

  • Lad være med at stole på autocommit. Overheaden ved at starte og udføre en transaktion for hver række er enorm. Brug eksplicitte transaktioner, og commit efter hver 1000 rækker (eller flere).

  • Brug forberedte udsagn. Da du dybest set laver de samme inserts tusindvis af gange, kan du forberede hvert insert, før du begynder at looping, og derefter udføre under loopet, og sende værdier som parametre. Jeg ved ikke, hvordan man gør dette med CodeIgniters databasebibliotek, du bliver nødt til at finde ud af det.

  • Indstil MySQL til import. Forøg cachebuffere og så videre. Se Speed ​​of INSERT-erklæringer for mere information.

  • Brug LOAD DATA INFILE. Hvis det er muligt. Det er bogstaveligt talt 20 gange hurtigere end at bruge INSERT til at indlæse data række for række. Jeg forstår, hvis du ikke kan, fordi du skal have det sidste indsættelses-id og så videre. Men i de fleste tilfælde, selvom du læser CSV-filen, omarrangerer den og skriver den ud til flere midlertidige CSV-filer, er dataindlæsningen stadig hurtigere end at bruge INSERT.

  • Gør det offline. Kør ikke langvarige opgaver under en webanmodning. Tidsgrænsen for en PHP-anmodning vil afslutte jobbet, hvis ikke i dag, så næste tirsdag, når jobbet er 10 % længere. Få i stedet webanmodningen til at stille jobbet i kø, og returner derefter kontrollen til brugeren. Du bør køre dataimporten som en serverproces og med jævne mellemrum tillade brugeren at få et glimt af fremskridtshastigheden. For eksempel er en billig måde at gøre dette på, at dit importscript udsender "." til en midlertidig fil, og derefter kan brugeren anmode om at få vist den midlertidige fil og blive ved med at genindlæse i deres browser. Hvis du vil have lyst, så gør noget med Ajax.



  1. SQL Server Genopbyg og Reorganiser Index

  2. Vælg punkter fra kortdatabasen efter radius

  3. pandas' read_sql med en liste over værdier for WHERE-tilstand

  4. Hvad gør en SQL-sætning sargerbar?