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.