Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/04/2011, 12h15   #1
Invité de passage
 
Inscription : septembre 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 16
Points : 4
Points : 4
Par défaut performance d'une requête avec jointure

Bonjour à tous,

J'ai la requête suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  SQL_NO_CACHE sc.idspectacle
 FROM  schedules sc
JOIN contacts c ON c.idcontact=sc.idcontact
JOIN (spectacles s 
	JOIN typesspectacles ty ON ty.idtypespectacle=s.idtypespectacle
	JOIN (text_spectacle ts
		JOIN texts t ON t.idtext=ts.idtext)
	ON ts.idspectacle=s.idspectacle
	JOIN spectacle_person sp ON sp.idspectacle=s.idspectacle
	JOIN spectacle_contact sct ON sct.idspectacle=s.idspectacle)
ON s.idspectacle=sc.idspectacle WHERE 1
ORDER BY sc.date DESC LIMIT 0,7;
qui mets plusieurs secondes à s'executer (minimun 4 sec.)

Si je supprime la jointure :

Code :
JOIN spectacle_person sp ON sp.idspectacle=s.idspectacle
La requête ne met que quelques millisecondes

Ma table spectacle_person contient 3 champs :

idspectacle => integer 11 => index/FK
idperson => integer 11 => index/FK
idrole => smallint 5 => index/FK

la clé primaire est sur ces 3 champs.

Il y a 30000 enregistrements dans cette table. Mais la table schedules en a 100000

Avez-vous une idée de pourquoi la jointure ralenti autant la requête ?

En pièce jointe, l'explain de la requête.

Merci d'avance
Images attachées
Type de fichier : png Capture-3.png (39,9 Ko, 3 affichages)
YvesTan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 18h22   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

Pourquoi toutes ces parenthèses dans les jointures, ce qui complique la lecture de la requête (et peut-être bien son plan d'exécution).
La requête suivante devrait, à tout le moins, donner le même résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT  SQL_NO_CACHE sc.idspectacle
FROM  schedules sc
JOIN contacts c ON c.idcontact=sc.idcontact
JOIN spectacles s ON s.idspectacle=sc.idspectacle
JOIN typesspectacles ty ON ty.idtypespectacle=s.idtypespectacle
JOIN text_spectacle ts ON ts.idspectacle=s.idspectacle
JOIN texts t ON t.idtext=ts.idtext
JOIN spectacle_person sp ON sp.idspectacle=s.idspectacle
JOIN spectacle_contact sct ON sct.idspectacle=s.idspectacle
WHERE 1
ORDER BY sc.date DESC LIMIT 0,7;
ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h52   #3
Invité de passage
 
Inscription : septembre 2005
Messages : 16
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 16
Points : 4
Points : 4
Merci pour ta réponse.

Les jointures me semblait plus "organisées" avec les parenthèses

Enfin, ça ne changeait rien sans les parenthèses.

Par contre, j'ai fait 2 choses :

1 - j'avais besoin d'un DISTINCT sur idspectacle et je l'ai ajouté sur sc.idspectacle = toujours le même temps d'exécution

2 - j'ai placé le DISTINCT sur le champ sp.idspectacle (SELECT DISTINCT sp.idspectacle)

Et là, miracle, la requête tombe à 0,4 secondes

Reste à vérifier la cohérence des résultats et surtout à essayer de comprendre le mécanisme !
YvesTan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/04/2011, 20h17   #4
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Bonjour,
Vous êtes sûr que les parenthèses ici sont inutiles ???
J'ai des doutes, j'ai l'impression qu'ici elles servent à réaliser une sorte de sous requêtes en jointure.
Normalement les parenthèses vont par exemple indiquer au moteur de réaliser d'abord telle jointure entre deux tables, puis de réaliser une autre jointure entre le résultat précédent et une nouvelle table. C'est totalement différent que de laisser les deux jointures se réaliser en même temps ...
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/04/2011, 21h03   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Ce sont des jointures internes... ça ne change donc rien en termes de résultats (il faudrait faire un explain pour voir si ça change quelque chose au niveau du plan d'exécution de la requête).
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h11.


 
 
 
 
Partenaires

Hébergement Web