Bonjour a tous !
J'ai une requete particuliere a optimiser dans un code que je n'ai pas fait moi meme (direct j'annonce la couleur), mais dont je comprends le fonctionnement (c'est deja ca). Ma requete mets 12s pour s'exécuter...
j'ai donc tatonné un peu, n'étant pas "pro" dans l'optimisation de requetes SQL... pour finalement trouver la partie qui ralentit toute la requete.
Voila ma requete complete avec en gras la partie "freinant" l'exécution :
select m.login, m.sexe, m.datenaissance, m.departement, m.annonce, m.wid, I1.date_req
from membres m
left join sessions I1 on m.wid=I1.wid
where
(
date_req is NULL or date_req in
(
select max(I2.date_req)
from sessions I2
where I2.wid = I1.wid
)
)
and m.wid != $monwid
and m.etat='actif'
and date_stop=0
and ADDTIME(date_req, '0:0:59')>NOW()
order by date_req desc limit $pagestart,$nppage
|
J'explique en 2-2 la requete
Le but est de récupérer la liste des membres ayant une session active donc :
1- ayant un id différent du mien (celui qui fait la demande)
2- dont l'état du compte est "actif" (parce qu'un utilisateur peut avoir plusieurs comptes pour un seul wid)
3- dont la date de fin de session n'est pas renseignée (donc encore en cours a priori)
4- et dont la date de la derniere requete date de moins d'une minute.
La boucle rajoutée en premier dans le where vient du fait qu'un utilisateur peut mal clore sa session et se reconnecter en recréant une nouvelle session (qui possede alors 2 enregistrements pour le meme utilisateur répondant a la requete)
Ne me dites pas "change le code", ca prendrait trop de temps (mon "boss" veut que ca soit plutot rapidement amélioré)
pour la table session : 1 clé primaire = "idsession"
pour la table membres : pas de clé primaire, mais 2 index (basiques) : Wid et Etat
Voilou
Si vous voyez comment je peux changer ca...
Message édité par Nanano le 21-12-2007 à 15:33:23