sql >> Databáze >  >> RDS >> Mysql

Potřebujete časově efektivní metodu importu velkého souboru CSV přes PHP do více tabulek MySQL

Napsal jsem PHP skripty pro hromadné načítání dat publikovaných výpisem dat Stack Overflow. Importuji miliony řádků a netrvá to tak dlouho.

Zde je několik tipů:

  • Nespoléhejte se na automatické potvrzení. Režie na zahájení a potvrzení transakce pro každý řádek je obrovská. Použijte explicitní transakce a potvrďte po každých 1000 řádcích (nebo více).

  • Použijte připravená prohlášení. Vzhledem k tomu, že v zásadě provádíte stejné vložení tisíckrát, můžete každou vložku připravit před zahájením smyčky a poté ji provést během smyčky a předat hodnoty jako parametry. Nevím, jak to udělat s databázovou knihovnou CodeIgniter, budete na to muset přijít.

  • Vylaďte MySQL pro import. Zvyšte mezipaměť a tak dále. Viz Rychlost příkazů INSERT pro více informací.

  • Použijte LOAD DATA INFILE. Pokud možno. Je to doslova 20x rychlejší než použití INSERT k načítání dat řádek po řádku. Chápu, pokud nemůžete, protože potřebujete získat poslední ID vložení a tak dále. Ale ve většině případů, i když si soubor CSV přečtete, změníte jeho uspořádání a zapíšete do více dočasných souborů CSV, načítání dat je stále rychlejší než pomocí INSERT.

  • Proveďte offline. Během webového požadavku nespouštějte dlouhotrvající úlohy. Časový limit požadavku PHP ukončí úlohu, pokud ne dnes, tak příští úterý, kdy je úloha o 10 % delší. Místo toho zařaďte webový požadavek do fronty na úlohu a poté vraťte řízení uživateli. Import dat byste měli spouštět jako proces serveru a pravidelně umožnit uživateli, aby zahlédl rychlost postupu. Například levným způsobem, jak toho dosáhnout, je, že váš importní skript vytvoří výstup "." do dočasného souboru a poté může uživatel požádat o zobrazení dočasného souboru a pokračovat v načítání ve svém prohlížeči. Pokud si chcete udělat fantazii, udělejte něco s Ajaxem.



  1. Odstraňte řádky SQL, kde ID nemají shodu, z jiné tabulky

  2. Jak získat statistické informace SQL Server pomocí systémových statistických funkcí

  3. SELECT DISTINCT na jednom sloupci

  4. Pořadí sloupců ve vícesloupcovém indexu v MySQL