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 29/05/2011, 23h17   #1
Membre du Club
 
Inscription : août 2009
Messages : 53
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2009
Messages : 53
Points : 48
Points : 48
Par défaut Perfo : Faut-il toujours faire des jointures ?

Bonjour,

Une question un peu naïve. J'ai une table d'articles et une table d'auteurs. Je lance une requête qui porte sur la première table dont j'extraits un certain nombre d'articles correspondant à une condition donnée.

Lors de l'affichage des résultats, j'ai besoin d'afficher non seulement le titre des articles mais aussi le nom de l'auteur.

La question : d'un point de vue performances, faut-il mieux que je fasse une seule requête avec une jointure entre les deux tables, ou est-il plus rapide de faire ma requête simplement sur la table des articles, puis autant de requêtes que nécessaire sur les id des auteurs au moment d'afficher les résultats ?

J'ai l'impression qu'une jointure coûte assez cher et n'est réellement utile que si la clause WHERE contient des conditions sur les deux tables. Car si je me passe de la jointure, la série de requêtes sur la table des auteurs ne devrait coûter pratiquement rien (clause where sur la clé primaire)...

Merci d'avance pour vos éclaircissements...
motton75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2011, 23h24   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 004
Points : 18 266
Points : 18 266
Envoyer un message via MSN à CinePhil
Oui il faut faire des jointures sans crainte ! C'est l'opération la plus optimisée dans un SGBD.
Et pour que ces jointures soient performantes, il faut bien sûr que les colonnes entrant en jeu dans la condition de jointure (après le ON) soient indexées.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 13h46   #3
Membre du Club
 
Inscription : août 2009
Messages : 53
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2009
Messages : 53
Points : 48
Points : 48
Merci, mais j'aimerais vraiment comprendre la raison à cela...

Pourquoi dans mon cas précis tu penses que la jointure est préférable ?

Si j'étais un ordinateur, je ferais dix fois plus de calculs pour faire une jointure et renvoyer N résultats, que pour rechercher N informations directement dans un index en répondant à des requêtes séparées.

Est-ce que c'est l'économie sur les temps d'accès à la base qui va faire la différence ?
motton75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 20h24   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 004
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 004
Points : 18 266
Points : 18 266
Envoyer un message via MSN à CinePhil
Citation:
Merci, mais j'aimerais vraiment comprendre la raison à cela...

Pourquoi dans mon cas précis tu penses que la jointure est préférable ?

Si j'étais un ordinateur, je ferais dix fois plus de calculs pour faire une jointure et renvoyer N résultats, que pour rechercher N informations directement dans un index en répondant à des requêtes séparées.

Est-ce que c'est l'économie sur les temps d'accès à la base qui va faire la différence ?
Citation:
La question : d'un point de vue performances, faut-il mieux que je fasse une seule requête avec une jointure entre les deux tables, ou est-il plus rapide de faire ma requête simplement sur la table des articles, puis autant de requêtes que nécessaire sur les id des auteurs au moment d'afficher les résultats ?
L'ordinateur calcule beaucoup plus vite que les données ne sont transmises sur le réseau.
X requêtes sont plus lentes qu'une seule.

Fais l'expérience !

Avec un faible volume de données, tu ne sentiras peut-être pas beaucoup de différence mais plus le volume de données augmente et plus la différence se fera sentir.

De plus, dans ton cas précis...
Citation:
Je lance une requête qui porte sur la première table dont j'extraits un certain nombre d'articles correspondant à une condition donnée.
On va supposer que tu as cette structure :
auteur_aut (aut_id, aut_nom...)
article_art (art_id, art_id_auteur, art_titre...)

La requête avec jointure ressemble donc à quelque chose comme ça :
Code :
1
2
3
4
SELECT art.art_titre, aut.aut_nom
FROM article_art art
INNER JOIN auteur_aut aut ON aut.aut_id = art.art_id_auteur
WHERE -- condition sur les articles
Le SGBD va estimer si c'est plus rapide de faire la jointure entre les deux tables ou bien de d'abord chercher les articles répondant à la condition et ne faire la jointure que sur ces articles.

Selon le volume de données et selon la condition, il est possible qu'il n'exécute pas toujours la requête dans le même sens !

Par contre, avec ton système à multiples requêtes, tu lui imposes la manière de faire et il y a fort à parier que ce ne sera pas toujours le moyen le plus rapide !

À lire sur les jointures et sur l'indexation.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/06/2011, 18h57   #5
Membre du Club
 
Inscription : août 2009
Messages : 53
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : août 2009
Messages : 53
Points : 48
Points : 48
Merci pour cette explication !
motton75 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 17h10.


 
 
 
 
Partenaires

Hébergement Web