plusieurs requêtes en une

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : plusieurs requêtes en une

par Hubert Roksor » 26 mars 2008, 01:19

on m'as dit que en php-mysql il valait mieux faire une grosse requête que plein de petites requêtes arrivant au même résultat
Pas forcément, ça dépend des cas. Il n'y a pas de relation directe entre le nombre de requêtes et les performances d'un script.
cette requête
Merci de ne poster que la requête, pas tout le script autour. Aussi, pense à formatter la requête, si tu fais des lignes de 300 caractères c'est super dur à lire.

Si tu veux l'optimiser, poste le résultat de la requête via EXPLAIN, préférablement dans le client MySQL (si tu es en local).
Par exemple, pour récupérer les auteurs et leurs post, une requête suffit.
Pour être complet, j'aimerais préciser que si la jointure porte sur un grand nombre d'enregistrements il se peut là encore que deux requêtes valent mieux qu'une. Par exemple, on voit ça dans le forums, dans les sujets à rallonge. Si on prend un sujet de 2000 messages et qu'on veut récupèrer les 10 messages les plus récents, avec une jointure le serveur est obligé de joindre 2000 messages à 2000 auteurs, puis trier le tout et afficher les 10 derniers. Dans ce cas précis, il vaut mieux rechercher les 10 derniers messages parmi 2000 puis faire une seconde requête pour les 10 autres de ces messages.

C'est pour ça qu'il vaut mieux tout tester, et jeter un oeil sur les résultats d'EXPLAIN.

par zeus » 26 mars 2008, 00:17

on m'as dit que en php-mysql il valait mieux faire une grosse requête que plein de petites requêtes arrivant au même résultat
C'est vrai quand tu peux faire des JOIN pour récupérer toutes les données en une fois.

Par exemple, pour récupérer les auteurs et leurs post, une requête suffit.
Par contre, pour connaitre le nom d'auteurs actifs et la date de dernière connexion de l'administrateur, il vaut mieux 2 requêtes ;)

par yuuzhantar » 25 mars 2008, 23:31

on m'as dit que en php-mysql il valait mieux faire une grosse requête que plein de petites requêtes arrivant au même résultat

çà consommait moins de ressources

sinon merci pour le union

je cherchais avec JOIN ON mais j'ai oublié que c'était pour oracle

edit, sa marche aussi sur mysql

sinon juste une petite question,
cette requête est horrible, pas optimisée ... et ne marche pas alors que je ne vois pourquoi
function connexion2_user()
	{
	global $global;
	
	$donnees1=bdd_executer("(select fu.* from fc_users as fu where user_mail='".$global['mailform']."') JOIN (select fi.* from fc_infos as fi where user_id='(SELECT user_id from fc_users where user_mail='".$global['mailform']."')') ON fu.user_id=fi.user_id");
	$donnees=bdd_suivant($donnees1);

...

}
çà ne marche pas et pourtant j'ai l'impression que la syntaxe est bonne
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN (select fi.* from fc_infos as fi where user_id='(SELECT user_id from fc_use'
même si sa sert a rien ( je fais un produit cartésien ) j'aime pas quand çà marche pas

par Hubert Roksor » 25 mars 2008, 16:22

Pour info, ce n'est pas le nombre de requêtes ou de sous-requêtes qui importe, mais ce qu'on leur fait faire. Ce serait comme faire Paris-Toulouse en voiture sans s'arrêter en pensant que ça fait moins travailler le moteur.

Concernant les requêtes du premier message, si ta table est MyISAM la première requête est gratuite. Pour les deux suivantes, assure-toi d'avoir un index sur user_date_inscription et un autre sur ip_derniere_action et elle seront très performantes.
Ca a le mérite de réduire le nombre de connexions au serveur.
Attention au vocabulaire, ce ne sont pas des connexions. Au mieux, on pourrait dire des "appels", mais bon, pour la plupart des sites tu t'en fiches d'économiser 1ms pour contacter le serveur MySQL, en imaginant qu'il ne se trouve pas sur la même machine.

par Sékiltoyai » 25 mars 2008, 15:42

Ca a le mérite de réduire le nombre de connexions au serveur.

par zeus » 25 mars 2008, 14:13

Je pense que Sekiltoyai répond bien à la question, sachant qu'il s'agit de 2 requêtes bien différentes (clause WHERE différentes) et qu'il n'est pas possible de regrouper autrement.

Maintenant, je me demande s'il faut réduire le nombre de requête pour les réduire. J'entends par là que je me demande s'il vaut mieux un UNION que 2 requêtes :-k

par Sékiltoyai » 25 mars 2008, 13:18

Je ne comprend pas le problème, si tu fais :

Code : Tout sélectionner

requète1 UNION requète2 UNION requète3
Tu ne fais qu'une seule requète. Je ne vois pas où est ce que cela gène…

par agité » 25 mars 2008, 11:48

Tu peux regarder du côté de UNION
AMHA il veux plutôt que de devoir utiliser des multiples query n'avoir qu'une seul requete qui vas chercher les differentes valeurs, hors sur la doc, UNION dit :
UNION est utilisé pour combiner le résultat de plusieurs requêtes SELECT en un seul résultat.
J'aurais la même question dans le cas de plusieurs requete a la suite por aller chercher sur differentes tables sans pouvoir utiliser d'INNER JOIN ou LEFT JOIN.

par Sékiltoyai » 24 mars 2008, 19:28

Tu peux regarder du côté de UNION

plusieurs requêtes en une

par yuuzhantar » 24 mars 2008, 17:57

Bonjour

je suis en train de reprogrammer la nouvelle version de mon site et je voudrais réduire le nombre de requêtes sql qu'il faut pour générer une page

j'exécute pour les statistiques du site 4 requêtes, et je voulais savoir si je pouvais en regrouper quelques unes

j'ai par exemple un

Code : Tout sélectionner

"select count(*) as inscrits from membres"
un

Code : Tout sélectionner

"select count(*) as inscrits_aujourdhui from membres where user_date_inscription='".$date."'
et

Code : Tout sélectionner

"select count(*) as connectes from ips where ip_derniere_action>'".($time+180)."'"
est ce qu'il n'y a pas une manière de les regrouper pour ne plus avoir qu'un seul mysql_query

par exemple en retournant des constantes avec mysql qui viennent de requêtes imbriquées
par exemple :

Code : Tout sélectionner

"select (select count(*) from membres) as inscrits, (select count(*) from membres where user_date_inscription='".$date."') as inscrits_aujourdhui, (select count(*) as connectes from ips where ip_derniere_action>'".($time+180)."') as connectes )";
sa ne marche pas mais j'espère que vous voyez l'idée, dans une requête exécuter plusieurs sous requêtes ... pour éviter de surcharger le serveur

merci

CREATE TABLE