[Optimisation Mysql] Qui peut m'aider ?

Qui peut m'aider ? [Optimisation Mysql] - SQL/NoSQL - Programmation

Marsh Posté le 08-06-2002 à 20:19:57    

Bonjour,
 
J'suis pas un grand codeur et j'ai bcp de mal à trouver sur le web de la doc detaillée pour bien optimiser certaine requete et surtout celle qui va suivre.  
 
Il s'agit de trier les infos d'une base de donnée contenant plus de 15000 noms. Ce que j'ai code c'est une requete tous ce qui se fait de plus bourrin car je ne sais pas vraiment faire autrement :) et evidemment elle est extrement longue à s'executer. Bref si vous pouviez me dire comment et surtout quelles commandes utiliser pour optimiser tout cela
 

Code :
  1. <?
  2. $res_m=mysql_db_query("$base","select * from user order by id",$db_link);
  3. $nb_m=mysql_num_rows($res_m);
  4. $i=0;
  5. $id=0;
  6. $agemoinsde25=0;
  7. $agemoinsde15=0;
  8. $agemoinsde35=0;
  9. $ageplusde35=0;
  10. /* boucle qui cherche dans la table tant que le nb maxi d'inscrits n'est pas atteint */
  11. while ($i<$nb_m)
  12. {
  13. $id=mysql_result($res_m,$i,id);
  14. $age=mysql_result($res_m,$i,age);
  15. $metier=mysql_result($res_m,$i,metier);
  16. $sexe=mysql_result($res_m,$i,sexe);
  17. // Age
  18. if ($age > 87 ) $agemoinsde15++;
  19. elseif ($age > 77 && $age <= 87) $agemoinsde25++;
  20. elseif ($age > 67 && $age <= 77) $agemoinsde35++;
  21. elseif ($age <= 67) $ageplusde35++;
  22. // Metier
  23. if ($metier==1) $metier1++;
  24. elseif ($metier==2) $metier2++;
  25. elseif ($metier==3) $metier3++;
  26. elseif ($metier==4) $metier4++;
  27. elseif ($metier==5) $metier5++;
  28. elseif ($metier==6) $metier6++;
  29. elseif ($metier==7) $metier7++;
  30. elseif ($metier==8) $metier8++;
  31. elseif ($metier==9) $metier9++;
  32. elseif ($metier==10) $metier10++;
  33. elseif ($metier==11) $metier11++;
  34. //Sexe
  35. if ($sexe==M) $homme++;
  36. else $femme++;
  37. ++$i;
  38. $id++;
  39. }
  40. ?>


 
Voila merci d'avance pour ceux qui m'aideront


Message édité par Stligar le 06-08-2002 à 20:29:58
Reply

Marsh Posté le 08-06-2002 à 20:19:57   

Reply

Marsh Posté le 08-06-2002 à 20:26:29    

Euh, ou qu'elle est ta requête?
 
Sinon, rajoute un index sur le champs que tu dois trier, et ca ira mieux  ;)


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 20:30:00    

Toutes les infos sont sur la meme table donc l'index je suis pas sur que cela change qq. chose ( à mons que je n'ia pas tout compris a l'index :)
 
j'ai fait l'edit pour la requete

Reply

Marsh Posté le 08-06-2002 à 20:33:57    

Stligar a écrit a écrit :

Toutes les infos sont sur la meme table donc l'index je suis pas sur que cela change qq. chose ( à mons que je n'ia pas tout compris a l'index :)
 
j'ai fait l'edit pour la requete  




 
En effet t'as pas compris pour l'index, rajoute un index sur id si il y en a pas.
 
Mais je pige pas pourquoi tu le tries vu que tu prends tout après  :heink:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 20:36:08    

L'index sur Id il est mis depuis le debut (une habitude  :) )
 
Sinon pour le tri je le fais car comme je l'ai dit au debut je n'y connais pas grand chose et c'est le seul truc que je connais pour recuperer des infos dans la base

Reply

Marsh Posté le 08-06-2002 à 20:41:39    

Stligar a écrit a écrit :

Sinon pour le tri je le fais car comme je l'ai dit au debut je n'y connais pas grand chose et c'est le seul truc que je connais pour recuperer des infos dans la base  




 
 :heink:  
 
select * from user  
 
c'est pas mal non plus  :D


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 20:53:24    

tu peux expliquer rapidement ce que tu veux faire, ca me lourde de lire le code là :D


Message édité par joce le 06-08-2002 à 20:53:30
Reply

Marsh Posté le 08-06-2002 à 20:57:08    

(et accessoirement j'essaie de comprendre pourquoi il colore la moitié des if / elseif :p)

Reply

Marsh Posté le 08-06-2002 à 20:57:31    

Il veux avoir le nombre de femmes/hommes, les métiers et le nombre de gens qui ont 0-15ans, 15-25ans, 25-35 et +35
 
C vrai qu'il y a mieux que le bête select et de faire les stats à la main, mais bon, deja si il trie faut un index et ici faut pas trier  :sarcastic:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 21:01:51    

ba :
 
select COUNT(*) from user WHERE age > 87;
select COUNT(*) from user WHERE age > 77 AND age <= 87;
select COUNT(*) from user WHERE age > 67 AND age <= 77;
select COUNT(*) from user WHERE age <= 67;
 
 
select COUNT(*) FROM user GROUP BY metier;
 
select COUNT(*) FROM user GROUP BY sexe;
 
tu fous un index sur :
 
age
metier
sexe
 
et rulez :)


Message édité par joce le 06-08-2002 à 21:02:54
Reply

Marsh Posté le 08-06-2002 à 21:01:51   

Reply

Marsh Posté le 08-06-2002 à 21:02:51    

joce a écrit a écrit :

ba :
 
select COUNT(*) from user WHERE age > 87;
select COUNT(*) from user WHERE age > 77 AND age <= 87;
select COUNT(*) from user WHERE age <= 67;
 
 
select COUNT(*) FROM user GROUP BY metier;
 
select COUNT(*) FROM user GROUP BY sexe;
 
tu fous un index sur :
 
age
metier
sexe
 
et rulez :)  




 
mets en place la wordlist pour java au lieu de faire du sql  ;)

Reply

Marsh Posté le 08-06-2002 à 21:03:17    

faut déjà que je débugge la wordlist actuelle :p

Reply

Marsh Posté le 08-06-2002 à 21:04:03    

joce a écrit a écrit :

faut déjà que je débugge la wordlist actuelle :p  




 
Si y avait que ca  :sarcastic:


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 21:05:37    

Ok merci pour reponses vais potasser ça :)

Reply

Marsh Posté le 08-06-2002 à 21:10:33    

http://www.phpinfo.net/?p=articles [...] tion-mysql
 
Lis cet article, y a des trucs intéressants  ;)


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 21:17:31    

excellent article :)

Reply

Marsh Posté le 08-06-2002 à 21:19:14    

Ok merchi

Reply

Marsh Posté le 08-06-2002 à 21:25:08    

joce a écrit a écrit :

excellent article :)  




 
Ouai mais il a fallu crier, il persistait qu'il savait créer une clé primaire pour +de 4 milliards d'éléments sur 3 bits  :pt1cable:  
 
Et bon, son histoire sur le null j'aime pas vraiment :/


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 21:27:35    

Zion a écrit a écrit :

 
 
Ouai mais il a fallu crier, il persistait qu'il savait créer une clé primaire pour +de 4 milliards d'éléments sur 3 bits  :pt1cable:  
 
Et bon, son histoire sur le null j'aime pas vraiment :/  




perso j'utilise pas les null, mais c'est vrai qu'il faut le voir du coté MySQL : faire une requète WHERE truc IS NULL n'a pas le même sens que WHERE truc='0'; (et ne renvoie pas les mêmes resultats ...)

Reply

Marsh Posté le 08-06-2002 à 21:44:16    

mais sinon le conseil d'émuler les champ boolean en faisant un char(0) qui est soit '' soit null, c bon ou y'a une autre méthode ?

Reply

Marsh Posté le 08-06-2002 à 22:26:17    

joce a écrit a écrit :

ba :
 
select COUNT(*) from user WHERE age > 87;
select COUNT(*) from user WHERE age > 77 AND age <= 87;
select COUNT(*) from user WHERE age > 67 AND age <= 77;
select COUNT(*) from user WHERE age <= 67;
 
 
select COUNT(*) FROM user GROUP BY metier;
 
select COUNT(*) FROM user GROUP BY sexe;




 
Coucou c'est remoi :)
 
J'ai avancé mais j'ai du mal avec les GROUP BY, j'arrive pas à recuperer toutes les valeurs, voila ce que je fais :
 

Code :
  1. $req=mysql_query("select COUNT(*) FROM user GROUP BY metier" );
  2. $metier=mysql_fetch_array($req);
  3. $metier1=$metier[0]; // celui la marche  
  4. $metier2=$metier[1]; // a partir de la j'ai plus de valeur


 
Ou ai je fait une erreur ?
Merci


Message édité par Stligar le 06-08-2002 à 22:26:52
Reply

Marsh Posté le 08-06-2002 à 22:30:45    

Faudrait ptre refaire un mysql_fetch_array, ca irait mieux


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 08-06-2002 à 22:33:53    

mysql_fetch_array te renvoie UNE ligne (le tableau représentant toutes les cases de cette ligne). Donc faut boucler. Si tu rajoutes 'metier' dans le SELECT :
 
while ($array = mysql_fetch_array($req)) {
  // traitement pour un métier
  echo "il y a " . $array["count(*)"] . " personnes qui font le metier " . $array["metier"] . "<br>";
}


Message édité par mrbebert le 06-08-2002 à 22:36:25
Reply

Marsh Posté le 08-06-2002 à 22:42:19    

Merci beaucoup pour les commentaires ... j'y retourne :)

Reply

Marsh Posté le 08-06-2002 à 22:44:02    

et puis si t'utilises $metier[0] autant utiliser mysql_fetch_row

Reply

Marsh Posté le 08-06-2002 à 23:14:48    

Bon ben merci à tous, maitenant ça marche mille fois mieux ... Y a pas à dire j'utilisais vraiment une methode de bourrin ! :D

Reply

Marsh Posté le 08-06-2002 à 23:43:37    

Vaut toujours mieux laisser le travail au serveur de base de donnée ... Ils sont doté de query-ptimizer et de different truc d'optimisation qui font le boulot pour toi.

Reply

Marsh Posté le 09-06-2002 à 00:00:57    

Vi mais moi j'ai pas accés au commande du serveur de BDD :)


Message édité par Stligar le 06-09-2002 à 00:01:33
Reply

Marsh Posté le 09-06-2002 à 08:25:36    

Ce que je voulait dire c qu'il vaut mieux faire plusieurs
SELECT COUNT(*) FROM ... WHERE ...;
que de faire un SELECT * FROM ...;
et puis de compter toi meme les different trucs.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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