Aller au contenu

Besoin d'aide pour optimiser une requete SQL sur deux tables


vespa

Sujets conseillés

Bonjour,

J'ai la requete suivante (récupéré d'un script) sur mon site qui est vraiment très très longue à sortir les résultats.

select pr.ffusername,pr.birth, pr.sex,pr.photo,pr.photopath from ".$prefix."_user_profile as pr,".$prefix."_user_photo as ph where pr.ffusername=ph.ffusername AND pr.approved=1 AND ph.approved=1 order by click DESC limit 0,$numberofstars

Pouvez vous me dire s'il y a moyen de l'optimiser un peu pour qu'elle soit plus rapide, j'ai cherché sur le net sans trop de succès pour le moment :(

Modifié par vespa
Lien vers le commentaire
Partager sur d’autres sites

Elle est déja pas mal optimisé pour ce qu'elle fait, regarde plutot du coté du serveur de base de donnée de ton hebergeur qui doit étre assez long.

Modifié par crocxx
Lien vers le commentaire
Partager sur d’autres sites

slt

oula, c'est fouilli tout ca ;p

sans connaitre reelement le resultat que tu veux et le schema de la base, tente ca:

select pr.ffusername, pr.birth, pr.sex, pr.photo, pr.photopath 
from ".$prefix."_user_profile pr
LEFT JOIN ".$prefix."_user_photo ph ON pr.approved = ph.approved
where pr.approved = 1
order by click DESC limit 0,$numberofstars

mais effectivement, ta requete n'est pas vilaine

Modifié par glibre
Lien vers le commentaire
Partager sur d’autres sites

Merci à tous pour votre aide et notamment à Dan

Elle est optimisée pour autant que tu aies des index sur username et approved dans ces deux tables :whistling:

Il manquait effectivement les index sur ces deux champs sur les deux tables, en les ajoutant la requete est passée (lorsque je l'exécute sous phpmyadmin) de :

Affichage des enregistrements 0 - 2 (3 total, traitement: 3.1886 sec.)

Affichage des enregistrements 0 - 2 (3 total, traitement: 0.0146 sec.)

Maintenant l'affichage est correct pour mes visiteurs sur la page utilisant cette requete, encore merci :P

P.S. Juste pour savoir, on peut mettre autant d'index que l'on veut sur une table ?

Lien vers le commentaire
Partager sur d’autres sites

Ben presque mais c'est pas le but car tu auras alors d'autre contre effet, l'imoportant c'est d'avoir des index sur tous les champs

qui servent à faire des liaisons. Tu as la commande EXPLAIN aussi pout t'aider.

Tu as de bonnes info ici : http://www.chevrel.org/fr/optimiser/phpmysql/

A+

Ps: si DAN repasse par là a-t-il reçu mon MP ?

Lien vers le commentaire
Partager sur d’autres sites

Techniquement, tu peux mettre autant d'index que tu veux sur une table.

Cependant, il vaut mieux éviter de surcharger ta base d'index. À la longue, ça occupe beaucoup trop d'espace disque et, pire, risque de rendre certaines requêtes plus longue qu'avec des index judicieusement placés ( MySQL peut assez vite cafouiller s'il est confronté à des choix d'index lorsqu'il tente d'optimiser les requêtes ) .

SELECT pr.ffusername,pr.birth, pr.sex,pr.photo,pr.photopath

FROM ".$prefix."_user_profile AS pr

JOIN ".$prefix."_user_photo AS ph ON pr.ffusername=ph.ffusername

WHERE pr.approved=1

AND ph.approved=1

ORDER BY click DESC

LIMIT 0,$numberofstars

À mon sens, un seul index sur ffusername de la table user_photo est suffisant.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...