grosse vs plusieurs petites (je parle de requetes...)
4 réponses
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...
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 ».
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 ».
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 ».
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
"Jean-Marc Molina" <goa_pasdepourriel_@ifrance.com> a écrit dans le message
de news: buislr$4i3$1@news-reader3.wanadoo.fr...
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é.
"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
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 ».
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 ».
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 ».