Requête SQL fait ramer le serveur

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
 
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
 
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é :(
 
Retire 1 OR au hazard
et regarde un coup pour voir
test un puis teste l'autre puis tu verra
:wink:
 
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
 
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%
 
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...
 
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 ?
 
oui... après, la solution peut passer par une table tampon qui serait mise à jour de façon périodique.
 
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...
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut