sql >> Databasteknik >  >> RDS >> Mysql

Behöver en tidseffektiv metod för att importera stor CSV-fil via PHP till flera MySQL-tabeller

Jag har skrivit PHP-skript för att massladda data som publiceras av Stack Overflow-datadump. Jag importerar miljontals rader och det tar inte så lång tid.

Här är några tips:

  • Lita inte på autocommit. Omkostnaderna för att starta och genomföra en transaktion för varje rad är enorm. Använd explicita transaktioner och commit efter var 1000:e rad (eller fler).

  • Använd förberedda uttalanden. Eftersom du i princip gör samma infogning tusentals gånger, kan du förbereda varje infogning innan du börjar loopa, och sedan köra under loopen och skicka värden som parametrar. Jag vet inte hur man gör det här med CodeIgniters databasbibliotek, du måste ta reda på det.

  • Justera MySQL för import. Öka cachebuffertar och så vidare. Se Speed ​​of INSERT Statements för mer information.

  • Använd LOAD DATA INFILE. Om möjligt. Det är bokstavligen 20 gånger snabbare än att använda INSERT för att ladda data rad för rad. Jag förstår om du inte kan eftersom du behöver få det sista infognings-id:t och så vidare. Men i de flesta fall, även om du läser CSV-filen, ordnar om den och skriver ut den till flera tillfälliga CSV-filer, är dataladdningen fortfarande snabbare än att använda INSERT.

  • Gör det offline. Kör inte långvariga uppgifter under en webbförfrågan. Tidsgränsen för en PHP-förfrågan kommer att avsluta jobbet, om inte idag så nästa tisdag när jobbet är 10 % längre. Låt istället webbförfrågan ställa jobbet i kö och återför sedan kontrollen till användaren. Du bör köra dataimporten som en serverprocess och med jämna mellanrum tillåta användaren att skymta framstegshastigheten. Ett billigt sätt att göra detta är till exempel att ditt importskript matar ut "." till en temporär fil, och sedan kan användaren begära att få se den tillfälliga filen och fortsätta ladda om i sin webbläsare. Om du vill bli fancy, gör något med Ajax.



  1. Hur man installerar den senaste MySQL 8 på Debian 10

  2. Hur REVERSE() fungerar i MariaDB

  3. PostgreSQL, komplex fråga för att beräkna ingredienser efter recept

  4. Hur genererar man ett intervall av siffror mellan två siffror?