Optimisation d'un count

Optimisation d'un count - SQL/NoSQL - Programmation

Marsh Posté le 06-02-2005 à 00:03:13    

Bonsoir, voilà un script que je viens de faire pour recompter les message de mon forum, or ce script est vraiment trés trés lent...
 
Je me demandais si il était pas possible d'optimiser ces foutus count, car il est quand mème bizarre que compter 30 suejt et 400 réponse me prennent 25 secondes....
 
Si vous avez une idée...
 

Code :
  1. $requete_sujet=mysql_query('SELECT id, reply  FROM sujet WHERE cat = "'.$cat.'" and sid="'.$sid.'" AND valider>="1" ') or die(mysql_error());
  2. $total_sujet = mysql_num_rows($requete_sujet);
  3.   echo'-<br>'.$total_sujet.' est le nombre de sujet dans la cat '.$cat.'';
  4. $i = "0";
  5. while($row = mysql_fetch_array($requete_sujet)) {
  6.             $tid =  $row['id'];
  7.            
  8. $requete_rep =  mysql_query('SELECT id FROM reponse WHERE sujet_id="'.$tid.'" AND valider="1" order by date_verif ASC') or die(mysql_error());
  9. $totalrep    =  mysql_num_rows($requete_rep);
  10.      if($row['reply']<$totalrep) {
  11.     MYSQL_QUERY("UPDATE sujet SET reply = $tid WHERE id='$sujeid'" );
  12.     }
  13. $i1 = $totalrep + $i1;
  14. }
  15. echo'- '.$i1.'- ';
  16. MYSQL_QUERY("UPDATE catforum SET nbre_sujet = $total WHERE id='$cat'" );
  17. MYSQL_QUERY("UPDATE catforum SET nbre_rep = $i1 WHERE id='$cat'" );
  18. echo'<br><br><br>ACTION :: OK<br><br><br>';


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 06-02-2005 à 00:03:13   

Reply

Marsh Posté le 06-02-2005 à 00:12:08    

sert toi de l'instruction COUNT de SQL car les SGBD sont fait de telle sorte que cette fonction est optimisée. Si tu comptes au niveau de PHP tu perds du temps étant donné qu'il fait sa requête sans utiliser l'optimisation du COUNT.
 
Donc à la place de ta première requête tu mettrais par exemple  

Code :
  1. SELECT COUNT(*) As nbLignes FROM sujet WHERE cat = "'.$cat.'" and sid="'.$sid.'" AND valider>="1"


 
pis pareil pour compter le nombre de réponses

Reply

Marsh Posté le 06-02-2005 à 00:24:32    

ah et puis un autre truc, c'est inutile de stocker des champs calculés comme le nombre de messages d'un sujet. Tu perds en cohérence et en intégrité des données. Il vaut mieux faire un COUNT, ça te permet :
- de pas avoir à utiliser un script pour mettre à jour le nombre de messages
- d'être sûr du résultat, le COUNT est infaillible :D
- si par hasard une autre page modifie le nombre de messages ou de sujet pour une raison quelconque l'information de la base de données devient erronée et cela t'obliges à passer par un script pour la corriger :/
 
Donc dans ta table "catforum", pas besoin des champs nbre_sujet, ni nbre_rep. D'une manière générale, on ne stocke pas de champs calculés sauf si le calcul est trop compliqué à faire

Reply

Marsh Posté le 06-02-2005 à 01:38:55    

ha bon ? il vaux mieux pas que je stocke le nombre de message ? Refaire un count à chaque fois sa risque d'ètre super lourd je pense.... Surout si à chauqe fois je dois recompter les sujet et leur réponses....


---------------
Créer son forum gratuit |  Mon beau blog phpBB caÿ le mal :o
Reply

Marsh Posté le 06-02-2005 à 02:02:12    

et index tes champs sur les quel tu fais ta recherce...  :o

Reply

Marsh Posté le 06-02-2005 à 15:04:58    

scull a écrit :

ha bon ? il vaux mieux pas que je stocke le nombre de message ? Refaire un count à chaque fois sa risque d'ètre super lourd je pense.... Surout si à chauqe fois je dois recompter les sujet et leur réponses....


 
nan justement c'est pas lourd à condition d'utiliser la fonction COUNT de SQL.
 
Pour avoir le nombre de sujets et de réponses par catégorie, il suffit de faire un truc du genre :

Code :
  1. SELECT COUNT(DISTINCT S.id) As nbSujets, COUNT(*) As nbReponses, cat.id
  2. FROM catforum cat, Sujet S, Reponse R
  3. WHERE cat.id=S.idcat
  4. AND R.sujet_id=S.id
  5. GROUP BY cat.id

Reply

Marsh Posté le 06-02-2005 à 23:12:26    

doudoule la banane a écrit :

et index tes champs sur les quel tu fais ta recherce...  :o


+1

Reply

Marsh Posté le 08-02-2005 à 18:34:14    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed