Requête lente
Le
benmouhoub5
Bjr à tous.
J'utilise une requête sql dans un programme php couplé à une base de
donnée Mysql.
Le problème est que, il y'a jusqu'a un moment la requête répondais
rapidement, mais maintenant elle est devenue terriblement lente; Je ne
sais pas pourquoi.
Voila la requête:
SELECT P.id_audio, P.note_audio, P.id_playlist, C.nom_audio,
C.id_artiste, A.nom_artiste, AVG( Pl.note_audio ) AS Moyenne,
COUNT( Pl.note_audio ) AS total, Co.id_compte, Co.avatar_compte,
Cs.cover_support FROM playlist_u P, playlist_u Pl, catalogue_a C,
catalogue_s Cs, artes A, comptes Co, comptes U WHERE P.id_user =
U.id_compte AND U.url = 'nasty' AND P.id_audio = C.id_audio AND
C.id_artiste = A.id_artiste AND Pl.id_audio = P.id_audio AND Co.id =
=
A.id_artiste AND C.id_support = Cs.id_support GROUP BY P.id_audio
ORDER BY P.note_audio DESC , Moyenne DESC LIMIT 0 , 5
Quelqu'un pour me faire une critique sur la requête et m'expliquer
pourquoi cette effondrement de performance ?
Merci
J'utilise une requête sql dans un programme php couplé à une base de
donnée Mysql.
Le problème est que, il y'a jusqu'a un moment la requête répondais
rapidement, mais maintenant elle est devenue terriblement lente; Je ne
sais pas pourquoi.
Voila la requête:
SELECT P.id_audio, P.note_audio, P.id_playlist, C.nom_audio,
C.id_artiste, A.nom_artiste, AVG( Pl.note_audio ) AS Moyenne,
COUNT( Pl.note_audio ) AS total, Co.id_compte, Co.avatar_compte,
Cs.cover_support FROM playlist_u P, playlist_u Pl, catalogue_a C,
catalogue_s Cs, artes A, comptes Co, comptes U WHERE P.id_user =
U.id_compte AND U.url = 'nasty' AND P.id_audio = C.id_audio AND
C.id_artiste = A.id_artiste AND Pl.id_audio = P.id_audio AND Co.id =
=
A.id_artiste AND C.id_support = Cs.id_support GROUP BY P.id_audio
ORDER BY P.note_audio DESC , Moyenne DESC LIMIT 0 , 5
Quelqu'un pour me faire une critique sur la requête et m'expliquer
pourquoi cette effondrement de performance ?
Merci

Poser une question


Ya des index sur les tables ?
A+
chris
J'ai cru entendre un jour qu'il était plus rapide de faire des
jointures que des "WHERE x.id = y.id".
A confirmer.
Eric
Oui, si vous voulez je peux poster la structure des tables pour vous
aider
je vais tester votre solution et vous confirmer ou vous infirmer cela
C.id_artiste, A.nom_artiste, AVG( Pl.note_audio ) AS Moyenne,
COUNT( Pl.note_audio ) AS total, Co.id_compte, Co.avatar_compte,
Cs.cover_support
FROM playlist_u P
INNER JOIN playlist_u Pl
ON P.id_audio = Pl.id_audio
INNER JOIN catalogue_a C
ON P.id_audio = C.id_audio
INNER JOIN catalogue_s Cs
ON C.id_support = Cs.id_support
INNER JOIN artes A
ON C.id_artiste = A.id_artiste
INNER JOIN comptes Co
ON A.id_artiste = Co.id
INNER JOIN comptes U
ON P.id_user = U.id_compte
WHERE U.url = 'nasty'
GROUP BY P.id_audio
ORDER BY P.note_audio DESC , Moyenne DESC
LIMIT 0 , 5
0) je ne voiT aucun intérêt à joindre une table sur elle même sur la
même colonne !
FROM playlist_u P
INNER JOIN playlist_u Pl
ON Pl.id_audio = P.id_audio
???
Comme vous le constatez, faire ses jointures avec des JOIN et non pas
noyées dans une clause WHERE permet de mettre en évidence des
incohérences...
1) y a t-il un index sous toutes les clef primaires et étrangères ?
a savoir :
table colonnes
-------------------- -----------------------------------
playlist_u id_audio, id_user
catalogue_a id_audio, id_support, id_artiste
catalogue_s id_support
artes id_artiste
comptes id, id_compte
2) y a t-il un index sur les conditions du filtre ? : comptes.url
3) y a t-il un index sur les colonnes triées ? : playlist_u.note_audio
a +
a écrit :
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************