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

Hai bisogno di un metodo efficiente in termini di tempo per importare file CSV di grandi dimensioni tramite PHP in più tabelle MySQL

Ho scritto script PHP per caricare in blocco i dati pubblicati dal dump dei dati di Stack Overflow. Importo milioni di righe e non ci vuole molto tempo.

Ecco alcuni suggerimenti:

  • Non fare affidamento sull'autocommit. Il sovraccarico dell'avvio e del commit di una transazione per ogni riga è enorme. Utilizza transazioni esplicite e esegui il commit ogni 1000 righe (o più).

  • Utilizza dichiarazioni preparate. Dato che fondamentalmente stai facendo gli stessi inserimenti migliaia di volte, puoi preparare ogni inserto prima di iniziare il ciclo e quindi eseguirlo durante il ciclo, passando i valori come parametri. Non so come farlo con la libreria di database di CodeIgniter, dovrai capirlo.

  • Ottimizza MySQL per l'importazione. Aumenta i buffer della cache e così via. Vedi Velocità delle dichiarazioni INSERT per ulteriori informazioni.

  • Utilizza LOAD DATA INFILE. Se possibile. È letteralmente 20 volte più veloce dell'utilizzo di INSERT per caricare i dati riga per riga. Capisco se non puoi perché devi ottenere l'ultimo ID di inserimento e così via. Ma nella maggior parte dei casi, anche se leggi il file CSV, lo riorganizzi e lo scrivi su più file CSV temporanei, il caricamento dei dati è comunque più veloce rispetto all'utilizzo di INSERT.

  • Fai offline. Non eseguire attività di lunga durata durante una richiesta Web. Il limite di tempo di una richiesta PHP interromperà il lavoro, se non oggi, martedì prossimo, quando il lavoro sarà più lungo del 10%. Invece, fai in modo che la richiesta Web accodi il lavoro e quindi restituisca il controllo all'utente. È necessario eseguire l'importazione dei dati come un processo server e consentire periodicamente all'utente di intravedere la velocità di avanzamento. Ad esempio, un modo economico per farlo è che lo script di importazione produca "." in un file temporaneo, quindi l'utente può richiedere di visualizzare il file temporaneo e continuare a ricaricare nel proprio browser. Se vuoi divertirti, fai qualcosa con Ajax.