8
votes

Devrais-je générer-limiter ou réduire mes requêtes de base de données?

Je crée un script PHP qui importe des données à partir de fichiers texte dans une base de données MySQL. Ces fichiers texte sont assez importants, un fichier moyen disposera de 10 000 lignes que chacune correspond à un nouvel élément que je souhaite dans ma base de données. (Je ne vais pas importer de fichiers très souvent)

Je suis inquiet de lire une ligne du fichier, puis de faire une requête d'insertion, 10 000 fois de suite pourraient causer des problèmes. Y a-t-il une meilleure façon pour moi de faire cela? Devrais-je effectuer une requête d'insertion avec toutes les 10 000 valeurs? Ou serait-ce aussi mauvais?

Peut-être que je peux atteindre un milieu et effectuer quelque chose comme 10 ou 100 entrées à la fois. Vraiment mon problème, c'est que je ne sais pas ce qui est une bonne pratique. Peut-être 10 000 questions d'une rangée vont-elles bien et je m'inquiète simplement pour rien.

Toute suggestion?


0 commentaires

3 Réponses :


2
votes

Je le ferais dans une grande requête avec toutes les valeurs à la fois. Juste pour être sûr, cependant, assurez-vous d'exécuter Démarrer la transaction; avant et commettre; par la suite, de sorte que si quelque chose ne va pas pendant l'exécution de la requête (ce qui est possible. , comme il fonctionnera très probablement pendant une période assez longue), la base de données ne sera pas affectée.


6 commentaires

Méfiez-vous que la délivrance d'un insert multiple réduira votre capacité à tracer des erreurs. Si l'une des lignes ne parvient pas à insérer, vous ne serez pas en mesure de détecter lequel on a déclenché l'erreur (et bien sûr, déposera tout le travail par lots au lieu d'avoir au moins avoir les bonnes)


Vrai. Je suppose que toutes les données insérées sont saines, aucune ligne ne doit pas échouer. La validation doit être effectuée sur les données avant d'être ajoutée à la chaîne de requête pour en assurer la solution.


Imnsho, perdant toute la transaction est préférable à une transaction partielle commis. Si la validation est susceptible d'être un problème, j'essaierais de résoudre celui-ci dans le cadre d'une seule transaction, par exemple en insérant d'abord dans une table temporaire, interrogeant entre les nouvelles données et les données existantes pour les lignes contradictoires, puis transférer des données De la table Temp à la table principale une fois que je suis sûr que tout est OK. Ce serait le meilleur des deux mondes (au coût de la complexité de code quelque peu plus grande)


Je suis d'accord que perdre la transaction est généralement ce que vous voudrez. Tout dépend des besoins réels de l'application


Oui, seule une partie des rangées à insérer serait probablement la pire chose possible. Si cela se produisait, vous devriez vérifier manuellement la base de données pour voir jusqu'où gagné l'importation, puis modifier le fichier d'importation pour supprimer les lignes déjà insérées et réorganiser le script d'importation.


D'accord, merci pour les commentaires. Oui, je préférerais probablement que tout ce qui soit échoue, par opposition à une partie de cela. Cette importation ne fonctionnera pas automatiquement, un utilisateur sera donc capable de voir et de modifier des choses si quelque chose ne va pas.



6
votes

Oui, il est xxx

http: // Sandbox. phpcode.eu/g/5ade4.php

Ceci fera une seule requête, qui est multiple plus rapide que le style d'une ligne-one-one-one-one-one-one-one-one-oney!


2 commentaires

Mais soyez prudent, car la taille de la requête doit être inférieure à votre paramètre max_allowd_packet pour le serveur! (voir my.ini)


@nate: Veuillez afficher votre support par accepter ma réponse via le bouton montré sur l'image



5
votes

Utilisation des déclarations préparées, suggérées par les auteurs de haute performance mysql . Cela permet d'économiser beaucoup de temps (économie du protocole inutile et du code SQL ASCII).


1 commentaires

Oh sympa! Je n'avais aucune idée de rien comme ça existait. Je vais def. Utilisez des déclarations préparées pour mon importation. Merci!