OVH Cloud OVH Cloud

grosse vs plusieurs petites (je parle de requetes...)

4 réponses
Avatar
xpatval
Bonjour à tous,

Voici voilà ma question:

J'ai une grosse requête (enfin, que moi j'appelle grosse en terme de nb de
données retourné) à partir de laquelle j'enclenche une boucle while afin de
traiter et d'afficher mes infos. Cela donne, rapidement écrit:

$sql = "select libelle, type, num_voit, groupe, class_dep, class_arr, nb_t,
km, nom, prenom from marque, voiture, participe, course, conduire, pilote
where
course.date = '". $date ."' and
class_arr > 0 and
participe.date = course.date and
participe.id_voiture = voiture.id_voiture and
voiture.id_marque = marque.id_marque and
pilote.id_pilote = conduire.id_pilote and
participe.id_participe = conduire.id_participe
order by class_arr, num_voit";

Vaut-il mieux coder comme ci-dessus, et tout récupérer d'un coup, ou bien
écrire comme suit:

$sql = "select libelle, type, participe.id_participe, num_voit, groupe,
class_dep, class_arr, nb_t, km, from marque, voiture, participe, course,
where
course.date = '". $date ."' and
class_arr > 0 and
participe.date = course.date and
participe.id_voiture = voiture.id_voiture and
voiture.id_marque = marque.id_marque order by class_arr, num_voit";
while ceci-cela
{
début traitement;
$id_p = $i[participe.id_participe];
if condition remplie
{
$sql = "select nom, prenom from participe, conduire,
pilote where pilote.id_pilote = conduire.id_pilote and
conduire.id_participe = '". $id_p ."'";

continuation et fin du traitement
}
}

Dans le premier cas, toutes les infos sont retournées en une fois. Pour moi,
la difficulté est la mise en page de certaines données.

Dans le second cas, la mise en page est largement simplifiée (bcp moins de
ruptures dans les boucles imbriquées du traitement, donc facilité
d'intégration avec html ), mais je vais faire une cinquantaine de requêtes
supplémentaires...

Merci de vos réponses.

xpatval

4 réponses

Avatar
Jean-Marc Molina
Il vaut mieux passer par une seule requête si tu peux ensuite te débrouiller
pour tout afficher. Le SGBD se charge de tout pour toi et il n'est pas
surchargé, 50 requêtes au lieu d'une pour 1000 visiteurs ça fait beaucoup de
différence...

select libelle, type, num_voit, groupe, class_dep, class_arr, nb_t,
km, nom, prenom from marque, voiture, participe, course, conduire, pilote

where

Tu devrais utiliser LEFT JOIN pour faire ta jointure (PHP/MySQL). Ça te
permet d'améliorer la lisibilité de ta requête en appliquant le WHERE sur la
table correspondante.

Ça donnerait quelque chose comme :
SELECT ... FROM voiture LEFT JOIN participe ON participe.id_voiture voiture.id...

Le « SELECT * FROM table_1, table_2 WHERE table_1.? = table_2.? » c'est bon
pour 2 tables ou 3 mais après (là 6) ça devient le chaos.

Tu devrais aussi tester le temps d'exécution des 2 scripts pour savoir
lequel est le plus adapté.

JM

--
Boycothon (Contre l'e-censure) : http://www.odebi.org/boycothon/ ~ « Le LEN
tue la démocratie ».

Avatar
xpatval
"Jean-Marc Molina" a écrit dans le message
de news: buislr$4i3$
Il vaut mieux passer par une seule requête si tu peux ensuite te
débrouiller

pour tout afficher. Le SGBD se charge de tout pour toi et il n'est pas
surchargé, 50 requêtes au lieu d'une pour 1000 visiteurs ça fait beaucoup
de

différence...

select libelle, type, num_voit, groupe, class_dep, class_arr, nb_t,
km, nom, prenom from marque, voiture, participe, course, conduire, pilote

where [...]
Le « SELECT * FROM table_1, table_2 WHERE table_1.? = table_2.? » c'est
bon

pour 2 tables ou 3 mais après (là 6) ça devient le chaos.


Une (mauvaise ? oui, si plusieurs personnes bossent sur le même projet .)
habitude...


Tu devrais aussi tester le temps d'exécution des 2 scripts pour savoir
lequel est le plus adapté.


Certaines fonctions de php le permettent ? J'avoue ne pas m'y être encore
penché.

xpatval


Avatar
Vincent

"Jean-Marc Molina" a écrit dans le message
de news: buislr$4i3$

Tu devrais aussi tester le temps d'exécution des 2 scripts pour savoir
lequel est le plus adapté.


Certaines fonctions de php le permettent ? J'avoue ne pas m'y être encore
penché.


<?php
echo date("H i s");
script1(); // en boucle 100 fois
echo date("H i s");

echo date("H i s");
script2(); // en boucle 100 fois
echo date("H i s");
?>

te donne déjà une petite estimation

Vincent

--
http://sommets.org
Bonnée année aux lecteurs


Avatar
Jean-Marc Molina
Une (mauvaise ? oui, si plusieurs personnes bossent sur le même projet .)
habitude...


Pas forcément, l'idéal serait de profiler les 2 requêtes. Je cherche
d'ailleurs un tel outil pour savoir ce qu'il se passe au coeur de MySQL.

Certaines fonctions de php le permettent ? J'avoue ne pas m'y être encore
penché.


Tu peux le faire simplement avec les fonctions Date & Time de PHP. Voir la
fonction « microtime », il y a même un exemple. Tu appelles cette fonction
au début du script et en fin puis tu fais la différence des temps.

Il y a aussi une classe PEAR qui fait tout le boulot pour toi. Zend Studio
intègre aussi un profiler qui est le meilleur moyen pour calculer le temps
pris par les boucles critiques de tes scripts.

Plusieurs solutions, à toi de jouer :).

JM

--
Boycothon (Contre l'e-censure) : http://www.odebi.org/boycothon/ ~ « Le LEN
tue la démocratie ».