Optimisation récupération d'un gros tableau MySQL.

Optimisation récupération d'un gros tableau MySQL. - PHP - Programmation

Marsh Posté le 07-05-2006 à 00:18:24    

J'ai un petit soucis, je demande, on sait jamais.
 
Voilà, je bosse sur un projet où chaque page doit récupérer toutes les infos d'une "grosse" table MySQL.
 
Donc, classiquement, je fais ceci :

Code :
  1. $lecture=mysql_query('SELECT * FROM matable');
  2. for ($i=0;$i<mysql_num_rows($lecture);$i++) {
  3. $recup=mysql_fetch_rows($lecture);
  4. $id[$i]=$recup['0'];
  5. $param1[$id]=$recup['1'];
  6. $param2[$id]=$recup['2'];
  7. ... (une quinzaine);
  8. }


 
Voilà, c'est tout balot. Je mets un '*' dans la requête car je dois récupérer toutes les infos de toutes façons.
Seulement voilà, ça prend presque 0,4ms juste pour cette boucle. C'est une relative grosse table qui risque de grossir encore et j'ai besoin de tout récupérer pour des besoins de calculs à la suite.
 
Si quelqu'un connait une façon d'optimiser ça, ça pourrait être sympa de me renseigner.
 
Merci d'avance.


Message édité par The-Shadow le 07-05-2006 à 00:28:34
Reply

Marsh Posté le 07-05-2006 à 00:18:24   

Reply

Marsh Posté le 07-05-2006 à 00:22:20    

le seul moyen que je vois serait de fragmenter le travail avec des LIMIT
maintenant je suis pas THE codeur php, mais en principe si tu as besoin de tout, y'a pas 36 000 optimisation à faire malheureusement..

Reply

Marsh Posté le 07-05-2006 à 00:23:39    

Capt1TaRace a écrit :

y'a pas 36 000 optimisation à faire malheureusement..


Ouai, je m'en doutais, mais je me suis dit que j'allais posé la question au cas où, on sait jamais. :D
Y'a p'têtre un gars sur HFR qui va me sortir l'optimisation qui roxxxe des loutres que personne connait. :D

Reply

Marsh Posté le 07-05-2006 à 00:24:56    

Déjà ta boucle est pas bien maline parce que mysql_num_rows va être exécutée à chaque tour de boucle. D'ailleurs tu n'en as pas besoin, les mysql_fetch_* renvoyant toujours false quand tu es sur le dernier tuple.
 
Sinon si tu fais la même chose sur chaque table c'est probablement factorisable en quelque chose de plus condensé, mais là c'est + une question de longueur de code que de vitesse d'exécution. Normalement tu peux pas faire bien mieux que mysql_fetch_row pour parser une table rapidement.
 


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-05-2006 à 00:28:25    

sielfried a écrit :

Déjà ta boucle est pas bien maline parce que mysql_num_rows va être exécutée à chaque tour de boucle. D'ailleurs tu n'en as pas besoin, les mysql_fetch_* renvoyant toujours false quand tu es sur le dernier tuple.


Explique ça, je pige pas.
Si je mets le fetch_row en dehors de la bouche et que dans ma boucle, je fais $id[$i]=$recup['0'], $id[$i] aura toujours la valeur de la première ligne de ma base non ?

Reply

Marsh Posté le 07-05-2006 à 00:34:49    

for ($i = 0; $recup = mysql_fetch_row($lecture); $i++)
 
Quand mysql_fetch_row renvoie false, la boucle est finie.


Message édité par sielfried le 07-05-2006 à 00:36:26

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-05-2006 à 00:39:42    

D'ailleurs c'est pas très clair, l'indice de tes tableau "$param" c'est le tableau $id ? [:pingouino]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-05-2006 à 00:40:30    

Ha oky, j'avais pas pensé à ça. :jap:

Reply

Marsh Posté le 07-05-2006 à 00:45:08    

sielfried a écrit :

D'ailleurs c'est pas très clair, l'indice de tes tableau "$param" c'est le tableau $id ? [:pingouino]


id est un autoincrémenté et j'identifie toutes mes lignes par leur id respectif, donc :
si id=366, $param1[366]=..., $param2[366]=..., etc.
 
je pourrais aussi faire $id[$i]=..., $param1[$i]=..., mais ça me permet de récupérer illico le $param1 de l'id 366.
 
Comment ferais-tu toi pour récupérer, par exemple, le param13 dont la ligne dans la bdd est 366 autrement ?

Reply

Marsh Posté le 07-05-2006 à 01:01:36    

Disons que là pour moi tous tes $param ont exactement le même indice, en l'occurence le tableau $id, donc j'ai un peu de mal à voir comment ton truc marche, mais en même temps il est 1h du matin et j'ai probablement loupé un truc évident.
 
Je verrais plutôt qqchose comme ça :

Code :
  1. while ($row = mysql_fetch_row($res)) {
  2.   $id = $row[0];
  3.   for ($numcol = 1; $i < $nbcol; $numcol++) {
  4.      $param[$id][$numcol] = $row[$numcol];
  5.   }
  6. }


 
(où numcol est le nombre de colonnes (champs) dans ta table)

Message cité 1 fois
Message édité par sielfried le 07-05-2006 à 01:02:38

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 07-05-2006 à 01:01:36   

Reply

Marsh Posté le 07-05-2006 à 01:05:54    

sielfried a écrit :

Disons que là pour moi tous tes $param ont exactement le même indice, en l'occurence le tableau $id, donc j'ai un peu de mal à voir comment ton truc marche, mais en même temps il est 1h du matin et j'ai probablement loupé un truc évident.
 
Je verrais plutôt qqchose comme ça :

Code :
  1. while ($row = mysql_fetch_row($res)) {
  2.   $id = $row[0];
  3.   for ($numcol = 1; $i < $nbcol; $numcol++) {
  4.      $param[$id][$numcol] = $row[$numcol];
  5.   }
  6. }


 
(où numcol est le nombre de colonnes (champs) dans ta table)


Bah, en gros, c'est ce que je fais, sauf que je fais une boucle for au lieu d'un while, mais j'avais tenté le while, j'y gagnais rien.
Par contre, $param, c'est des noms que j'ai donné pour l'exemple, en fait les params n'ont pas du tout le même nom. Ils ne s'appellent pas param1 param2.  :D


Message édité par The-Shadow le 07-05-2006 à 01:06:28
Reply

Sujets relatifs:

Leave a Replay

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