Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1402 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  De l'interet des tables temporaires (benchmark inside)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

De l'interet des tables temporaires (benchmark inside)

n°1166674
Eric B
Posté le 01-08-2005 à 13:13:09  profilanswer
 

Bonjour,
 
j ai fait quelques statistiques sur l usage d un webmail PHP/MySQL avec une table de 50Mo pour le contenu des mails. Ce webmail doit etre changé car c est conceptuellement une hérésie: tout les champs d un mail sont un champ ds une seule table pour tout les utilisateurs. Du coup, chq acces au webmail requiert la generation de la mailbox de l'utilisateur).  
 
 
Sans retoucher au code car tout sera jeté à priori, j ai juste voulu faire des requetes sur les mails échangés au courts des 2 ans d utilisations, avec le nb de mail par mois ou par jour.
 
Comme MySQL est un SGBD très limité (les sous requètes ne devraient elles pas fonctionner avec la version 4.l où est ce PHPMyadmin qui est encore plus limité que MySQL?), j ai eu l occasion de découvrir le bien fondé des tables temporaires. Ici, il n est pas question de requete complexe nécessitant la table temporaire, mais plutot de performances.
 
Avec des requetes ds une boucle, la différence  peut s'averer monstrueuse.
 
Voici ma "simple" requete SQL dans une boucle (PHP) avec la variable $day:

Code :
  1. for ($i = 0; $i < $nbdays1 ; $i++)
  2. // for the last nbdays
  3. $day = $nbdays1 - $i - 1;
  4. "SELECT COUNT(date_sent) FROM $table WHERE ( TO_DAYS(date_sent) = (TO_DAYS(NOW()) - $day) )";
  5. //...
  6. }


 
Sur 150 jours (donc 150 requètes), la page est générée completememt en 26s
Avec 3 requetes de + pour la création/isertion/suppression d'une table temporaire, cela descend à 3s, soit un rapport 10 !!
 
Voici le code de ces 3 requetes:

Code :
  1. $sql1 = "CREATE TEMPORARY TABLE $tmp (date_sent VARCHAR(20))";
  2. $sql2 = "INSERT INTO $tmp SELECT date_sent FROM $table WHERE date_sent IS NOT NULL"; //ORDER BY date_sent ASC"; // 0,2 s slower with order by!
  3. $sql3 = "DROP TABLE $tmp";
  4. $table = $tmp // pour prendre en compte la table temp ds la requete principale


 
Impressionné par le rapport de perfs, j'ai voulu par ce topic partager cette expérience.
Ci cela peut donner des idées à certains pour optimiser leurs sites...

mood
Publicité
Posté le 01-08-2005 à 13:13:09  profilanswer
 

n°1166733
cinocks
Posté le 01-08-2005 à 14:08:58  profilanswer
 

tu as peut-etre dejà moyen de rectifier le tir sur la premiere requete. 26 secondes pour ca, ce n'est vraiment pas terrible. Commence par positionner correctement les index. Ensuite la boucle PHP est immonde. Faire 150 requetes alors qu'il est possible de n'en faire qu'une. ;-)


---------------
MZP est de retour
n°1166795
Eric B
Posté le 01-08-2005 à 14:50:42  profilanswer
 

je suis preneur de toute suggestion. Comment ferais tu une seule requete?

n°1166869
cinocks
Posté le 01-08-2005 à 15:23:28  profilanswer
 

SELECT DATE, count(...) FROM matable WHERE DATE >= TODAY()- $nbdays1  
GROUP BY DATE
 
Et tu as un regroupement par date avec un count pour chacune. Que demander de plus. Ensuite, si tu as un index placer correctement sur la date, ca y ira encore plus vite.


---------------
MZP est de retour
n°1167025
Eric B
Posté le 01-08-2005 à 16:57:53  profilanswer
 

Ca parrait trop beau pour marcher:
 
SELECT DATE, COUNT(date_sent) FROM mail_sentdate1 WHERE DATE >= TODAYS()- 12 GROUP BY DATE  
[mysql error 1064] Erreur de syntaxe près de '()- 12 GROUP BY DATE' à la ligne 1
 
SELECT DATE, COUNT(date_sent) FROM mail_sentdate1 WHERE (DATE >= TO_DAYS(NOW()) - 12) GROUP BY DATE  
[mysql error 1054] Champ 'DATE' inconnu dans field list


Message édité par Eric B le 01-08-2005 à 16:59:09
n°1167112
betsamee
Asterisk Zeperyl
Posté le 01-08-2005 à 17:46:16  profilanswer
 

utilises Date_Add(Now() ,interval days -12) plutot

n°1167162
Eric B
Posté le 01-08-2005 à 18:04:02  profilanswer
 

marche tjs pas.
Mais sur le principe, cela m etonne. L element DATE peut varier à l interieur de la requete?
 
Comme résultat, je veux un truc comme cela :
11 171
10 138
9 4
8 18
7 242
6 219
5 156
4 184
3 112
2       7
1 13
0 204
 
C est vrai qu avec la date à la place de mes numero, la solution que vous proposez me parait séduisante, mais je ne vois pas comment MySQL peut se dépatouiller avec cette variable DATE

n°1167325
cinocks
Posté le 01-08-2005 à 20:33:05  profilanswer
 

Eric B a écrit :

Ca parrait trop beau pour marcher:
 
SELECT DATE, COUNT(date_sent) FROM mail_sentdate1 WHERE DATE >= TODAYS()- 12 GROUP BY DATE  
[mysql error 1064] Erreur de syntaxe près de '()- 12 GROUP BY DATE' à la ligne 1
 
SELECT DATE, COUNT(date_sent) FROM mail_sentdate1 WHERE (DATE >= TO_DAYS(NOW()) - 12) GROUP BY DATE  
[mysql error 1054] Champ 'DATE' inconnu dans field list


 
non mais faut adapter la requete à tes champs, hein :o


---------------
MZP est de retour
n°1167326
cinocks
Posté le 01-08-2005 à 20:34:51  profilanswer
 

Eric B a écrit :

marche tjs pas.
Mais sur le principe, cela m etonne. L element DATE peut varier à l interieur de la requete?
 
Comme résultat, je veux un truc comme cela :
11 171
10 138
9 4
8 18
7 242
6 219
5 156
4 184
3 112
2       7
1 13
0 204
 
C est vrai qu avec la date à la place de mes numero, la solution que vous proposez me parait séduisante, mais je ne vois pas comment MySQL peut se dépatouiller avec cette variable DATE


 
c'est le principe du regroupement par date. Heureusement que la date varie, sinon le champs ne servirait à rien.


---------------
MZP est de retour

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  De l'interet des tables temporaires (benchmark inside)

 

Sujets relatifs
SQL Server - Connaitre noms dernieres tables modifieesLiaison entre deux tables
update sur ttes mes tables commençant par "IT_"[SQL - ORACLE] Faire un somme de count sur plusieurs tables
Requete sur deux tablesinterroger plusieurs tables
liste générée a partir de champs contenus dans 2 tablesmis à jour de 2 tables sous delphi
[MySQL] Lister les tables de manière flexible (tri, etc...)[PHP] - mysql - connaitre la derniere action sur une liste de tables
Plus de sujets relatifs à : De l'interet des tables temporaires (benchmark inside)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR