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 09/11/2011, 08h41   #1
Invité de passage
 
Inscription : janvier 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 20
Points : 1
Points : 1
Par défaut Probleme de non utilisation de clé primaire/index

Bonjour,

Voila j'ai :
- une table INNODB T1 avec un champ IDCAT (entre autres)
clé PRIMARY sur le champ IDCAT
nbenreg = 150
- une table INNODB T2 avec un champ IDCAT (entre autres)
clé PRIMARY sur le champ IDCAT
nb enreg = 16

lorsque je fais l’instruction suivante (avec un EXPLAIN devant) :
Code :
SELECT T1.*,T2.LIBCAT FROM T1, T2 WHERE T1.IDCAT=T2.IDCAT
j'obtiens
id	select_type 	table 	      type 	possible_keys 	key 
1	SIMPLE		T2            ALL	PRIMARY		NULL
la table T1 utilisant bien sa clé primaire

je ne comprends pas pourquoi la table T2 n'utilise pas sa clé primaire ?
saluts92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 09h29   #2
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : février 2006
Messages : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Salut,

Donne nous un peu plus de détails (défs des tables, résultat exact du EXPLAIN)...

De plus, la syntaxe pour les jointures est :
Citation:
"SELECT BLABLA FROM T_TABLE_1 t1 INNER JOIN T_TABLE_2 t2 ON t2.ID = t1.ID"
Jette un coup d’œil ici
http://sqlpro.developpez.com/cours/sqlaz/jointures/
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 13h35   #3
Invité de passage
 
Inscription : janvier 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 20
Points : 1
Points : 1
j'ai également essayé avec le INNER JOIN le résutat est le meme

résultat du explain
id select_type table type possible_keys key ref rows Extra
1 SIMPLE T2 ALL PRIMARY NULL NULL 16
1 SIMPLE T1 ref IDCAT IDCAT 1 5
saluts92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/11/2011, 23h57   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 029
Points : 18 328
Points : 18 328
Envoyer un message via MSN à CinePhil
Citation:
je ne comprends pas pourquoi la table T2 n'utilise pas sa clé primaire ?
Probablement à cause de ça :
Citation:
nb enreg = 16
L'optimiseur juge que ça ne vaut pas le coup d'utiliser l'index pour seulement 16 valeurs.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 17h10   #5
Invité régulier
 
Inscription : mai 2009
Messages : 15
Détails du profil
Informations forums :
Inscription : mai 2009
Messages : 15
Points : 7
Points : 7
Ton explain plan est normal:

1 SIMPLE T2 ALL PRIMARY NULL NULL 16
1 SIMPLE T1 ref IDCAT IDCAT 1 5

Comme tu n'as pas de condition sur ta table T1 ou T2, tu te tapes un fullscan.

Essais par exemple un explain sur la même requête avec par exemple à la fin un:


AND T1.IDCAT=200;

ou

AND T2.IDCAT=200;

Tu verras que dans tes deux cas les index sont bien pris en compte.


Si tu n'as pas cette condition le moteur est obligé de comparer tous les champs de la table T2 d'ou le fullscan.

De manière général, il faut être le plus restrictif possible dans les requêtes. Si tu veux comparer des éléments dans deux tables sans restriction, c'est fullscan obligatoire.

Gozzs
gozzs 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 10h25.


 
 
 
 
Partenaires

Hébergement Web