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

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP - MYSQL] optimisation d'une requete

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP - MYSQL] optimisation d'une requete

n°823814
guiotv2
Posté le 15-08-2004 à 22:52:37  profilanswer
 

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
mood
Publicité
Posté le 15-08-2004 à 22:52:37  profilanswer
 

n°823877
pascal_
Posté le 16-08-2004 à 00:27:23  profilanswer
 

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]

n°823900
naceroth
Posté le 16-08-2004 à 01:00:33  profilanswer
 

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
n°823905
guiotv2
Posté le 16-08-2004 à 01:34:05  profilanswer
 

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.

n°824668
kalex
Posté le 17-08-2004 à 01:32:49  profilanswer
 

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

n°826787
guiotv2
Posté le 19-08-2004 à 14:52:30  profilanswer
 

@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 ?

n°826805
pascal_
Posté le 19-08-2004 à 15:04:22  profilanswer
 

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
n°826825
guiotv2
Posté le 19-08-2004 à 15:24:32  profilanswer
 

@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 !

n°827035
kalex
Posté le 19-08-2004 à 18:21:17  profilanswer
 

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

n°827055
naceroth
Posté le 19-08-2004 à 18:42:22  profilanswer
 

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

mood
Publicité
Posté le 19-08-2004 à 18:42:22  profilanswer
 

n°827058
gizmo
Posté le 19-08-2004 à 18:45:04  profilanswer
 

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

n°827074
naceroth
Posté le 19-08-2004 à 19:08:20  profilanswer
 

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

n°827139
kalex
Posté le 19-08-2004 à 20:15:24  profilanswer
 

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.

n°827167
gizmo
Posté le 19-08-2004 à 20:47:02  profilanswer
 

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.

n°827390
guiotv2
Posté le 20-08-2004 à 01:18:53  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP - MYSQL] optimisation d'une requete

 

Sujets relatifs
PHP, Dreamweaver, et session -debutant-asp ou php ?
[PHP] Redirection dynamique [résolu]Comment obtenir que les 10 premières lignes du résultat d'une requête
Requete SQL multi criteres[Recherche] Codeur PHP pour ptit site
EXCEL/PHP propriétés non accessibles (PIA?)Conversion mysql vers oracle
openoffice php mysql[MYSQL PHP] Requete ne renvoyant qu'1 champ, optimisation du code.
Plus de sujets relatifs à : [PHP - MYSQL] optimisation d'une requete


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