IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

INSERT sur une table en fonction d'autres INSERT


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut INSERT sur une table en fonction d'autres INSERT
    Bonjour,
    Pour la mise à jour quotidienne de ma base de données, je récupère des infos d'un fichier XML.
    La plupart des articles nécessitent juste un INSERT.
    D'autres doivent répondre à un critère particulier. Selon un drapeau, une autre insertion sur une autre table doit être effectuée. Pour être plus explicite, c'est des articles dont quelques-uns doivent être "taggés".
    Donc, je fais un INSERT sur ma tables articles. Si c'est un article à être taggé je récupère mysql_insert_id() dans une variable et j'utilise cette variable pour faire un autre INSERT sur la table tags.
    Je me demandais si c'était possible de créer une procédure MySQL pour ne pas passer par les itérations php qui sur les premiers articles est très rapide puis au bout de la 30e devient assez lent (de 1 à 5 sec) jusqu'à aboutir à la 60e.

    Mon script php fonctionne mais je voulais l'améliorer pour la vitesse.
    Si nécessaire je posterais ce que j'ai déjà fait.

    Merci

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Utilise PDO et les requêtes préparées. Cela permettra d'améliorer grandement le temps d'exécution de ton script.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Merci Spartacusply, mais c'est ce que j'ai fais.
    Je pensais améliorer quelque chose en passant par le PDO mais le seul gain c'est la deuxième requête qui gagne du temps. Il faut dire que c'est un gain minimum, quelques centièmes de secondes. Le reste aucun changement majeur. A partir du 30e enregistrement, le reste est assez long à s'effectuer comparativement aux premières requêtes.

  4. #4
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    As-tu identifié ce qui clairement prends du temps ? Combien de requêtes SQL sont effectuées au final ? Peux tu montrer ton script qui procède à l'ensemble de l'insertion ?

    Il n'y a pas de raison que cela soit aussi long sur si peu d'itération (à partir de plusieurs dizaine de milliers je dis pas mais 60 c'est absolument rien du tout) et surtoutt il n'y a aucune raison que ce soit plus long à la fin qu'au début.
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Après avoir "profilé" mon script avec xdebug, il s'est avéré que c'est le fonction execute du PDO qui prenait tout ce temps. Donc, Php n'est pas incriminé. J'ai fais un test avec une nouvelle base avec juste deux tables. Le résultat est tout à fait acceptable. De l'ordre de 5% du temps que me prend le travail réel.
    Seulement, dans le réel, ma base contient 42 tables: c'est un CMS.
    Je pense que c'est dû au nombre de tables. Pourtant, le travail requis de mise à jour ne se fait que sur ces deux tables.
    Si ça n'a rien à voir je poste le script ici.

    Je cherche encore.

  6. #6
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Le nombre de table n'a normalement aucune influence.

    Par contre la construction de ces tables (en particulier des deux tables incriminées) peut avoir une grande importance. Assure toi que tout est optimisé de ce c^té là (index, type etc...)
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  7. #7
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Les deux tables de la nouvelle base sont une copie (faite avec phpmyadmin) de la base d'origine. Donc, aucune différence entre les deux.

    Je cherche toujours.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Je reviens parce que je n'ai toujours pas trouvé de solution.
    En fait, j'ai solutionné une partie. Après avoir "parsé" mon xml, je récupère les articles qui ne sont pas liés à ma deuxième table. Je lance ensuite une requête unique du style
    INSERT INTO `articles` (`valeur`,`user_id`,`user_domain`) VALUES (1,1,'user@domaine.com'),(14,1,'user14@domaine.com'),(411,8,'user8@domaine.com'),.... il en y a plus de 40. L'exécution est rapide.
    Ensuite je passe sur les autres articles :

    en boucle :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `articles` (`valeur`,`user_id`,`user_domain`) VALUES (144,1,'user47@domaine.com')
    je récupère le last_id

    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO `articles_tags` (`article_id`,`user_id`) VALUES ($last_id,1);
    A partir de là, chaque insertion prend des secondes (2 à 15 sec) même la première avant de passer à la suivante.
    Je ne sais pas si mysql est en train de rouler en fond pour exécuter ma première tâche celle des articles seuls avant de passer au reste.
    Y aurai-il un moyen de vérifier celà?

  9. #9
    Membre éprouvé
    Homme Profil pro
    Touche à tout informatique autodidacte
    Inscrit en
    Janvier 2007
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Touche à tout informatique autodidacte

    Informations forums :
    Inscription : Janvier 2007
    Messages : 808
    Points : 912
    Points
    912
    Par défaut
    Bonjour,
    Je me suis dis que la deuxième partie (celle qui gérait deux tables) pouvait poser problème, j'ai donc lancé le traitement juste pour celle-ci. C'est hyper rapide.
    Ma conclusion pour l'instant, c'est que le traitement de la quarantaine d'INSERT fait rouler MySql en tâche de fond et le reste ne peut s'exécuter que jusqu'à ce que le moteur soit libre.
    Je cherche donc s'il y a moyen de voir réellement ce que fait MySql. Pas juste un "profiling" mais un véritable debug.

    En fait, ça ne pose pas un gros problème d'attendre deux minutes pour mon traitement mais quand même quand on dit que l'insertion est rapide!!

Discussions similaires

  1. Comment faire SET sur une table lié a 3 autres tables
    Par Battosaiii dans le forum Oracle
    Réponses: 2
    Dernier message: 13/04/2011, 17h59
  2. Lenteur des INSERT sur une table InnoDB
    Par olive_le_malin dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/06/2010, 12h47
  3. pb d'insertion dans une table lier a d'autres
    Par s.mustapha86 dans le forum Hibernate
    Réponses: 6
    Dernier message: 19/07/2008, 20h13
  4. journalisation des updates, inserts sur une table
    Par philou28 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/04/2007, 16h07
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo