J'ai écrit des scripts PHP pour charger en masse les données publiées par Stack Overflow data dump. J'importe des millions de lignes et cela ne prend pas beaucoup de temps.
Voici quelques conseils :
-
Ne comptez pas sur la validation automatique. La surcharge de démarrage et de validation d'une transaction pour chaque ligne est énorme. Utilisez des transactions explicites et validez toutes les 1 000 lignes (ou plus).
-
Utilisez des déclarations préparées. Étant donné que vous effectuez essentiellement les mêmes insertions des milliers de fois, vous pouvez préparer chaque insertion avant de commencer la boucle, puis exécuter pendant la boucle, en transmettant des valeurs en tant que paramètres. Je ne sais pas comment faire cela avec la bibliothèque de base de données de CodeIgniter, vous devrez le comprendre.
-
Régler MySQL pour l'importation. Augmentez les tampons de cache et ainsi de suite. Voir Vitesse des instructions INSERT pour plus d'informations.
-
Utilisez LOAD DATA INFILE. Si possible. C'est littéralement 20 fois plus rapide que d'utiliser INSERT pour charger les données ligne par ligne. Je comprends si vous ne pouvez pas parce que vous devez obtenir le dernier identifiant d'insertion et ainsi de suite. Mais dans la plupart des cas, même si vous lisez le fichier CSV, le réorganisez et l'écrivez dans plusieurs fichiers CSV temporaires, le chargement des données est toujours plus rapide qu'avec INSERT.
-
Faites-le hors ligne. N'exécutez pas de tâches de longue durée pendant une requête Web. La limite de temps d'une requête PHP mettra fin au travail, si ce n'est aujourd'hui, alors mardi prochain lorsque le travail est 10 % plus long. Au lieu de cela, placez la demande Web dans la file d'attente du travail, puis rendez le contrôle à l'utilisateur. Vous devez exécuter l'importation de données en tant que processus serveur et permettre périodiquement à l'utilisateur d'avoir un aperçu du taux de progression. Par exemple, un moyen peu coûteux de le faire est que votre script d'importation affiche "." dans un fichier temporaire, puis l'utilisateur peut demander à afficher le fichier temporaire et continuer à recharger dans son navigateur. Si vous voulez être fantaisiste, faites quelque chose avec Ajax.