De l'interet des tables temporaires (benchmark inside)

De l'interet des tables temporaires (benchmark inside) - SQL/NoSQL - Programmation

Marsh Posté le 01-08-2005 à 13:13:09    

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...

Reply

Marsh Posté le 01-08-2005 à 13:13:09   

Reply

Marsh Posté le 01-08-2005 à 14:08:58    

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
Reply

Marsh Posté le 01-08-2005 à 14:50:42    

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

Reply

Marsh Posté le 01-08-2005 à 15:23:28    

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
Reply

Marsh Posté le 01-08-2005 à 16:57:53    

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
Reply

Marsh Posté le 01-08-2005 à 17:46:16    

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

Reply

Marsh Posté le 01-08-2005 à 18:04:02    

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

Reply

Marsh Posté le 01-08-2005 à 20:33:05    

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
Reply

Marsh Posté le 01-08-2005 à 20:34:51    

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
Reply

Sujets relatifs:

Leave a Replay

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