PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 02-01-2012 15:02:50

jcnconsultant
Membre
Inscription : 06-09-2010
Messages : 9

Mysql : select et update en fonction du résultat

Bonjour à tous et meilleurs voeux au seuil de cette nouvelle année.
Voilà mon problème :
J'ai trois tables avec des jointures :
isf_ingenieur, isf_diplomes et une table temporaire isf_tempo dans laquelle j'ai mis les modifications que je dois effectuer sur les deux premières (c'est le résultat d'une inclusion de fichier Excel) .
En fonction du résultat du SELECT je mets le champ temp_flag = 1 ou non via un UPDATE à l'intérieur du WHILE.

Cette opération fonctionne, le résultat que j'obtiens est exact,  mais elle met beaucoup de temps : près de 40 minutes pour une table isf_tempo de 8.000 lignes. Or je dois traiter des tables plus importantes de 80.000 lignes et plus...
Je me demande donc si je ne peux l'effectuer en une seule transaction qui me permettrait de gagner, peut être, du temps d'exécution.
Quelqu'un parmi vous pourrait-il m'aider ou m'orienter car je sèche sur la solution ?
Un grand merci d'avance.
Jean-Claude l'ancien

 
$startTime = microtime(true);
$a="1";
    $sql1 = "SELECT *
     
    FROM isf_tempo t1
    LEFT JOIN isf_diplomes t2
    ON t1.temp_num_asso=t2.dip_num_association
    LEFT JOIN isf_repertoire t3
    ON t2.dip_num_ingenieur=t3.rep_numero
   
    WHERE
    t1.temp_nom = t3.rep_nom
    AND t1.temp_prenom = t3.rep_prenom
    AND t1.temp_millesime = t2.dip_millesime
    "
;
   
    # on envoie la requête
    $req1 = mysql_query($sql1) or die('Erreur SQL !<br />'.$sql1.'<br />'.mysql_error());
    while($data1 = mysql_fetch_assoc($req1))
      {
        $sql2 = "UPDATE isf_tempo SET temp_flag='1', temp_maj='M' WHERE temp_id ='".$data1['temp_id']."'";
        # on envoie la requête
        $req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error());
        $a++;        
      }
      echo "<div class=\"erreur1\">Il y a ".$a." diplomés de cette association déjà dans la base. Ils ont été signalés et marqués.</div>";
    $endTime = microtime(true);  
    $elapsed = $endTime - $startTime;  
     
    echo "Temps d'exécution : $elapsed secondes";  

 

Hors ligne

#2 02-01-2012 17:02:53

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Mysql : select et update en fonction du résultat

salut, et bonne année à toi aussi wink

penses à créer des indexes sur les champs que tu utilises dans tes wheres et tes tris wink

ça devrai diviser par 100 voir 1000 tes temps de traitement wink

a++

Hors ligne

#3 02-01-2012 18:44:35

jcnconsultant
Membre
Inscription : 06-09-2010
Messages : 9

Re : Mysql : select et update en fonction du résultat

Merci, Merci, Merci Pierrot !
Grâce à toi l'année commence bien pour moi... smile:)
J'avais complètement oublié ce point plus qu'important dans les bases de données : l'indexing
J'avais bien indexé certains champs de ces tables pour d'autres processus mais j'avais oublié de le faire pour celui-ci (les champs en cause sont différents)
De ce fait le temps de process est passé de 40 minutes à 34 secondes (et oui tu as bien lu !!!) pour 8000 lignes.
Bravo.:)

Jean-Claude l'ancien.

Hors ligne

#4 03-01-2012 13:50:30

Pierrot
Ancien nouveau
Inscription : 08-05-2009
Messages : 1 195

Re : Mysql : select et update en fonction du résultat

c'est juste 80 fois plus rapide wink
j'étais pas loin dans mes prédictions wink
a++

Hors ligne

#5 29-01-2012 07:59:21

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Mysql : select et update en fonction du résultat

Bonjour,

J'ai hésité longtemps à mettre mon grain de sel, mais si ta base de données avait été modélisée correctement (au moins normalisée de niveau 3), tu n'aurais pas eu besoin d'avoir à rajouter des indexs là où il n'en faut pas juste pour devoir optimiser une requête. Alors tu pourrais me dire, oui mais cela peut arriver quand même que ce besoin survienne, auquel cas je répondrais "certes", mais rien que cette partie là :

AND t1.temp_prenom = t3.rep_prenom

démontre le bien fondé de ma remarque.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

Pied de page des forums