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 25/09/2008, 17h52   #1
En attente de confirmation mail
 
Inscription : octobre 2002
Messages : 347
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 347
Points : 94
Points : 94
Par défaut une requête INNER JOIN est-elle toujours plus performante qu'un produit cartesien ?

Bonjour,

j'ai toujours utilisé des produits cartesiens pour faire mes jointures.
Là je suis face à un gros problème de ralentissement/performance dans un jeu de bcp de données et je me demande en utilisant des INNER JOIN je n'y gagnerai pas en vitesse...

qu'en pensez-vous ?

est-ce qu'une INNER JOIN va toujours plus vite qu'un produit cartésien sous mysql ?
Ekimasu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2008, 19h27   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 276
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 276
Points : 1 936
Points : 1 936
Salut,
Produit cartésien pour moi ça veut dire pas de jointure entre 2 tables.
A mon avis tu veux plutôt parler de jointures non normalisées, non ?
Je pense pas que la syntaxe normalisée ou non est vraiment une influence sur les perfs.
A mon avis vérifie d'abord tes indexes et fait des explain sur les requêtes problématiques.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2008, 20h39   #3
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
Bonjour,

Citation:
Envoyé par skuatamad Voir le message
Produit cartésien pour moi ça veut dire pas de jointure entre 2 tables.
On peut tout à fait utiliser le produit cartésien pour effectuer une jointure.
Citation:
Envoyé par skuatamad Voir le message
A mon avis tu veux plutôt parler de jointures non normalisées, non ?
Les jointures non normalisées ne sont qu'une selection sur un produit cartésien.
Citation:
Envoyé par skuatamad Voir le message
Je pense pas que la syntaxe normalisée ou non est vraiment une influence sur les perfs.
J'ai entendus dire que certains SGBD faisaient des optimisation lors du JOIN, mais la normalisation est principalement utile en terme de portabilité et de lisibilité.
Citation:
Envoyé par skuatamad Voir le message
A mon avis vérifie d'abord tes indexes et fait des explain sur les requêtes problématiques.
Il y a en effet toutes les chances que cela vienne de ça.

@USA Mike : Peut-tu nous montrer ton script de création et la requête éxécuté ?
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2008, 21h11   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 276
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 276
Points : 1 936
Points : 1 936
Salut kazou
Citation:
Envoyé par kazou Voir le message
On peut tout à fait utiliser le produit cartésien pour effectuer une jointure.
...
Les jointures non normalisées ne sont qu'une selection sur un produit cartésien.
...
Je suis un peu surpris par ce que tu dis car pour moi dans ce cas c'est plus du produit cartésien mais à mon avis c'est juste un problème de terminologie.

Pour moi il n'y a produit cartésien que dans le cas sans jointure comme :
D'ailleurs sqlpro dit ici :
Citation:
Rappelons que le produit cartésien de deux ensembles n'est autre que la multiplication généralisée. Dans le cas des tables, c'est le fait d'associer à chacune des lignes de la première table, toutes les lignes de la seconde. Ainsi, si la première table compte 267 lignes et la seconde 1214, on se retrouve avec un résultat contenant 324 138 lignes.
J'interprète peut être mal mais dans ce cas un complément d'info est le bien venu.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2008, 22h08   #5
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
A mon sens une jointure est le fait de faire corresponder deux enregistrement d'enssemble différents.

Les moyens utilisés importent peu, dans ce cas l'utilisation de la syntaxe avec JOIN permet d'expliciter la jointure alors que passer par un produit cartésien (grâce au FROM multiple) puis d'effectuer une selection pour projeter que des informations qui correspondent conduit souvent à avoir une requête peu explicite où l'on ne sais plus ce qui est critère de jointure ou simple selection.

Bien évidement ce n'est qu'une histoire de terminologie mais les deux écritures suivant sont des jointures et totalement équivalentes :

Code :
1
2
3
SELECT *
FROM t1, t2
WHERE t1.id = t2.id_t1
Code :
1
2
3
SELECT *
FROM t1
INNER JOIN t2 ON t1.id = t2.id_t1
Utiliser le WHERE dans le but de réaliser une jointure pourrait être considétré sémantiquement faux par certains.

En effet WHERE devrait uniquement servir à définir des critère de selection alors que ON sert uniquement a définir des critères de jointure or dans la première requête, le WHERE définit un critère de jointure.

Bien sûr comme dans beaucoup de domaines c'est surtout une question de point de vue, certains irons dans mon sens d'autres non
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/09/2008, 22h41   #6
En attente de confirmation mail
 
Inscription : octobre 2002
Messages : 347
Détails du profil
Informations forums :
Inscription : octobre 2002
Messages : 347
Points : 94
Points : 94
merci de vos réponses.
bon je vais essayer en rajoutant des indexs un peu partout..comme j'ai pas de limite de capacité disque, ça devrait pas poser de problème..

ps :
oui j'entendais bien par produit cartésien, une jointure comme ça :
Code :
1
2
3
SELECT *
FROM t1, t2
WHERE t1.id = t2.id_t1
Ekimasu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2008, 10h04   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 276
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 276
Points : 1 936
Points : 1 936
Ok kazou, t'as raison :
Citation:
Envoyé par kazou Voir le message
Les jointures non normalisées ne sont qu'une selection sur un produit cartésien.
Je ne savais pas (ou plus car j'avais déjà lu le lien suivant ) que l'on parlait également de produit cartésien dans ce cas comme le confirme fsmrel ici de façon très détaillée comme d'habitude
Autant pour moi.
skuatamad 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 06h15.


 
 
 
 
Partenaires

Hébergement Web