Requête SQL fait ramer le serveur

WRInaute impliqué
Bonsoir,

Voyez vous un problème dans la requête ci dessous car lorsque je l'exécute, ça rame énormèment ?

Code:
SELECT * FROM questions 
									INNER JOIN amis ON (amis.num_membre = $_SESSION[membre]
									OR amis.num_ami = $_SESSION[membre])
									AND (amis.num_membre = questions.num_membre
									 OR amis.num_ami = questions.num_membre)
				WHERE questions.num_membre != $_SESSION[membre]
				ORDER BY questions.num_question DESC LIMIT 0,8
 
WRInaute passionné
y a quoi qui rame ?
explique en 2 mot le probleme

ps :
OR
AND
OR

meme un être humain il deviens dingue avec ce type de condition
 
WRInaute impliqué
Cette requête est appelé sur la page d'accueil et fait ramer la page au chargement :(

Du coup, pour pas que ça rame je simplifie en faisant

SELECT * FROM questions ORDER BY num_question DESC LIMIT 0,8

Et là forcèment, le chargement est rapide mais je n'obtiens pas le but recherché :(
 
WRInaute passionné
Retire 1 OR au hazard
et regarde un coup pour voir
test un puis teste l'autre puis tu verra
:wink:
 
WRInaute discret
cloacking a dit:
Bonsoir,

Voyez vous un problème dans la requête ci dessous car lorsque je l'exécute, ça rame énormèment ?

Code:
SELECT * FROM questions 
									INNER JOIN amis ON (amis.num_membre = $_SESSION[membre]
									OR amis.num_ami = $_SESSION[membre])
									AND (amis.num_membre = questions.num_membre
									 OR amis.num_ami = questions.num_membre)
				WHERE questions.num_membre != $_SESSION[membre]
				ORDER BY questions.num_question DESC LIMIT 0,8

tu pourrais pas simplifier ton inner join... en revoyant un peu ton modele de bases de données et en simpliant le coup du num_membre et num_ami ! parce que un OR dans la jointure ca plombe tout !

sinon essaye ca dejà :

Code:
SELECT * FROM questions 
					INNER JOIN amis amis1 ON amis1.num_membre = questions.num_membre
					INNER JOIN amis amis2 ON amis2.num_ami = questions.num_membre
			WHERE questions.num_membre != $_SESSION[membre]
				AND (amis1.num_membre = $_SESSION[membre]
					OR amis2.num_ami = $_SESSION[membre])
			ORDER BY questions.num_question DESC LIMIT 0,8
 
WRInaute passionné
Je penses que si tu crées une vue de ta requette, et tu effectue un select * dessus, cela sera plus rapide.
Après je ne suis pas sur à 100%
 
WRInaute discret
Borower a dit:
Je penses que si tu crées une vue de ta requette, et tu effectue un select * dessus, cela sera plus rapide.
Après je ne suis pas sur à 100%


le problème des vues c'est qu'elles sont dynamiques, donc calculées dynamiquement et donc tout aussi lentes... tu y gagneras peut-être quelque chose, mais ce sera peanuts...
 
WRInaute passionné
ayor a dit:
Borower a dit:
Je penses que si tu crées une vue de ta requette, et tu effectue un select * dessus, cela sera plus rapide.
Après je ne suis pas sur à 100%


le problème des vues c'est qu'elles sont dynamiques, donc calculées dynamiquement et donc tout aussi lentes... tu y gagneras peut-être quelque chose, mais ce sera peanuts...

Quand on fait un select sur une vue, le SGBD recalcul les résultats de la vue a chaque fois ou pas ?
Peut on lui spécifier un cache ?
 
WRInaute discret
oui... après, la solution peut passer par une table tampon qui serait mise à jour de façon périodique.
 
WRInaute discret
Si une requête rame pensez a utilisé EXPLAIN juste avant votre requête. Et la mysql va vous expliqué la requete et vous montrez la ou ca rame comme des index qui manque etc...
 
Discussions similaires
Haut