[PHP - MYSQL] optimisation d'une requete

optimisation d'une requete [PHP - MYSQL] - PHP - Programmation

Marsh Posté le 15-08-2004 à 22:52:37    

Bonjour,
 
je post mon code afin qu'on puisse m'aider à l'optimiser car tout fonctionne mais c'est tres lent...
 
 
 

Code :
  1. <FORM ACTION="index.php" METHOD="post"><P class="corps">
  2. La coordonnée X : <INPUT TYPE=TEXT SIZE=5 NAME="x" class="saisie"><BR>
  3. La coordonnée Y : <INPUT TYPE=TEXT SIZE=5 NAME="y" class="saisie">
  4. <BR><BR>
  5. <INPUT TYPE="submit" VALUE="la MAP" class="saisie2"></FORM>
  6. <BR><BR>
  7. <?PHP
  8. include ("parametre_bd.php" );
  9. If (!empty($_POST['x'])){$x=$_POST['x'];}Else{$x=0;}
  10. If (!empty($_POST['y'])){$y=$_POST['y'];}Else{$y=0;}
  11. $x_max = $x + 11;
  12. $x_min = $x - 11;
  13. $y_max = $y + 11;
  14. $y_min = $y - 11;
  15. echo '<TABLE cellspacing=0 cellpadding=0 width=750 border=0 align=center background="star.gif">';
  16. for ($i = $y_min ; $i < $y_max + 1 ; $i++) {
  17.       echo '<TR>';
  18.       $k = 0;
  19.      
  20.        for ($k = $x_min ; $k < $x_max + 1 ; $k++) {
  21. $requete = mysql_query("SELECT id, nom, x, y FROM systeme WHERE x = ".$k." AND y = ".$i." ",$link);
  22. $row = mysql_fetch_object($requete);
  23. $id = $row->id;
  24. $nom = $row->nom;
  25. $x = $row->x;
  26. $y = $row->y;
  27. if (empty ($id) ) {echo '<TD width="20" height="20">';}
  28. else {echo '<TD width="20" height="20"><img src="sys1.gif" alt="'.$nom.' - '.$id.' - ('.$x.'/'.$y.')" border=0>';}
  29. mysql_free_result($requete);
  30.       echo '</TD>';
  31.         }
  32.       echo '</TR>';
  33. }
  34. echo '</table>';
  35. ?>


Message édité par guiotv2 le 19-08-2004 à 12:07:44
Reply

Marsh Posté le 15-08-2004 à 22:52:37   

Reply

Marsh Posté le 16-08-2004 à 00:27:23    

Essaye de ne pas faire $y_max*$x_max requête !
 
Tu déclare un tableau php.
 
Tu fais la requête unique "SELECT id, nom, x, y FROM systeme"
Pour chaque ligne tu  remplis ton tableau ( genre tab[x+y*x_max]=$row )
 
Puis tu fais tes 2 boucles dans lesquelles tu testes l'existence de tab[$i+$k*x_max]

Reply

Marsh Posté le 16-08-2004 à 01:00:33    

Puis il y a sûrement moyen de "simplifier" la requête genre

Code :
  1. select id, nom, x, y FROM systeme WHERE (x between $x_min and $x_max) and (y between $y_min and $y_max)


 
non ?


Message édité par naceroth le 16-08-2004 à 01:01:19
Reply

Marsh Posté le 16-08-2004 à 01:34:05    

pascal_ a écrit :

Essaye de ne pas faire $y_max*$x_max requête !
Tu déclare un tableau php.
Tu fais la requête unique "SELECT id, nom, x, y FROM systeme"
Pour chaque ligne tu  remplis ton tableau ( genre tab[x+y*x_max]=$row )
Puis tu fais tes 2 boucles dans lesquelles tu testes l'existence de tab[$i+$k*x_max]


 
Ta solution ma l'aire logique, une seul requete ça ira normalement beaucoup plus vite.
PAr contre j'ai jamais utiliser de tableau en PHP...  :sweat: je vais m'y mettre...
 
 
@naceroth : oui tu as raison aussi j evais combiner vos deux reponse et voir le résultat...
 
 
 :hello: Merci a tous les deux.

Reply

Marsh Posté le 17-08-2004 à 01:32:49    

[Question bête] tu as créé les index appropriés ?
Pour avoir des infos, fais EXPLAIN suivi de ta requête SQL.

Reply

Marsh Posté le 19-08-2004 à 14:52:30    

@Kalex : heu, non je ne crois pas avoir fais d'index... voici le resultat de ce que tu m'a demander.
 
requête SQL: EXPLAIN SELECT id, nom, x, y FROM systeme WHERE ( x BETWEEN 0 AND 22 ) AND ( y BETWEEN 0 AND 22 );  
 
table  type  possible_keys  key  key_len  ref  rows  Extra  
systeme ALL NULL NULL NULL NULL 4034 Using where  
 
 
@Pascal_ : j'ai bien compris ta logique par contre je metrise pas du tout les array en php, j'ai regarder sur nexen et phpdebutant mais là je lutte.
est ce qu'il faut que je crée un tableau par ligne ? ou bien créer un tableau a plusieur dimension ?
je ne comprend pas ta syntax : tab[x+y*x_max]=$row  les "+" "*" ?? ils servent a quoi ?

Reply

Marsh Posté le 19-08-2004 à 15:04:22    

guiotv2 a écrit :

@Kalex : heu, non je ne crois pas avoir fais d'index... voici le resultat de ce que tu m'a demander.
 
requête SQL: EXPLAIN SELECT id, nom, x, y FROM systeme WHERE ( x BETWEEN 0 AND 22 ) AND ( y BETWEEN 0 AND 22 );  
 
table  type  possible_keys  key  key_len  ref  rows  Extra  
systeme ALL NULL NULL NULL NULL 4034 Using where  


 
Le ALL signifie que Mysql doit parcourir toute la table en entier pour trouver les informations. Essaye de mettre deux index, un sur le champ x l'autre sur le champ y (ça se fait en 3 click avec phpMyAdmin). Fait le surtout si ta table contient beaucoup de lignes.
 

guiotv2 a écrit :


@Pascal_ : j'ai bien compris ta logique par contre je metrise pas du tout les array en php, j'ai regarder sur nexen et phpdebutant mais là je lutte.
est ce qu'il faut que je crée un tableau par ligne ? ou bien créer un tableau a plusieur dimension ?
je ne comprend pas ta syntax : tab[x+y*x_max]=$row  les "+" "*" ?? ils servent a quoi ?


 
C'est un tableau 2 dimensions ramené à 1 dimension.
Php gère les tableaux plusieurs dimension apparemment (jamais testé), ce qui donnerait alors : tab[$x][$y]=$row


Message édité par pascal_ le 19-08-2004 à 15:04:38
Reply

Marsh Posté le 19-08-2004 à 15:24:32    

@pascal : Mysql parcours la totalite de la table meme si on met un "where ...." ??
En fait il suffit de 2 click avec phpmyadmin ! ;)
 
Je crois que je vais devenir maboul pour les tableu en plusieur dimensions !
 
je reviendrais ici, si je n'y arrive pas !
Merci !

Reply

Marsh Posté le 19-08-2004 à 18:21:17    

guiotv2 a écrit :

@Kalex : heu, non je ne crois pas avoir fais d'index... voici le resultat de ce que tu m'a demander.
 
requête SQL: EXPLAIN SELECT id, nom, x, y FROM systeme WHERE ( x BETWEEN 0 AND 22 ) AND ( y BETWEEN 0 AND 22 );  
 
table  type  possible_keys  key  key_len  ref  rows  Extra  
systeme ALL NULL NULL NULL NULL 4034 Using where

Ok, c'est totalement normal que ce soit lent ! ;)
La doc : http://www.nexen.net/docs/mysql/annotee/explain.php

Reply

Marsh Posté le 19-08-2004 à 18:42:22    

4034 tupples à examiner ? tu m'étonnes que ce soit lent, surtout sans index

Reply

Marsh Posté le 19-08-2004 à 18:42:22   

Reply

Marsh Posté le 19-08-2004 à 18:45:04    

naceroth a écrit :

4034 tupples à examiner ? tu m'étonnes que ce soit lent, surtout sans index


4034 tuples, normalement c'est rien du tout à examiner, même sans index...

Reply

Marsh Posté le 19-08-2004 à 19:08:20    

Le normalement est important, j'en ai déjà vu ramer pour beaucoup moins que ça :)

Reply

Marsh Posté le 19-08-2004 à 20:15:24    

guiotv2 a écrit :

@pascal : Mysql parcours la totalite de la table meme si on met un "where ...." ??
En fait il suffit de 2 click avec phpmyadmin ! ;)
 
Je crois que je vais devenir maboul pour les tableu en plusieur dimensions !
 
je reviendrais ici, si je n'y arrive pas !
Merci !

Les tableaux multi dimensions, c'est pas plus compliqué que ceux à une ! Il suffi de te dire que ton tableau ne s'appelle pas $tab, mais $tab[1], c'est juste un tableau normal stoquer dans un tableau. Tu y accèdes "normalement" :
$tab[0] : le premier tableau stoqué dans $tab.
$tab[0][0] le premier élément du tableau $tab[0].
 
Un tableau c'est juste une manière pratique de représenter des variables.

Reply

Marsh Posté le 19-08-2004 à 20:47:02    

naceroth a écrit :

Le normalement est important, j'en ai déjà vu ramer pour beaucoup moins que ça :)


regarde sa requète, elle n'a rien d'extra-ordinaire. Dans la db dont je m'occupe, on a fait de test avant de mettre les indexs, les temps de réponses avec 6-7 jointures étaient encore acceptables avec une moyenne de 200K tuples.

Reply

Marsh Posté le 20-08-2004 à 01:18:53    

He bien !
 
y a eu du monde depuis que je suis passé !  :)  
 
Merci Kalex pour tes explication.
 
 
J'ai un peu galérer pour comprendre comment ça fonctionnait mais j'y suis arriver.
Et je peux vous dire qu'avec les index + l'utilisation des tableaux et bien l'affichage est 10 fois plus rapide !  
 
Merci à tous !

Reply

Sujets relatifs:

Leave a Replay

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