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 11/08/2011, 09h40   #1
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 87
Points : 17
Points : 17
Par défaut Vue et/ou Index ?

Bonjour,

J'ai une base de données qui contient des marques, chaque marque appartenant à une (ou plusieurs) activité, elle même dépendant d'un secteur.

A chaque fois que je fais un select de mes marques en fonction du secteur je dois me coltiner les jointures de 4 tables ! (marque, marque_has_activite, activite, secteur).

J'ai déjà demandé ici si ma requête était "optimale" et on m'a répondu que oui, pourtant quand j'affiche mes marques triées par secteur je trouve ça lent...

J'ai cherché du côté des index mais j'avoue que je trouve le concept bien flou ! Et puis je me suis dit aussi, pourquoi ne pas faire une vue avec chaque marque + ses activités + ses secteurs et là indexer quelque chose.

Seul hic : Comment faire ça ? Quand la vue doit-elle être mise en place ? Quand doit elle-être maj ? Et sur quoi mettre mes index ??

Please aidez moi !

Je vous joins la requête que j'utilise fréquemment : (enseigne = marque)
Code :
1
2
3
4
5
6
7
8
SELECT DISTINCT nom, idenseigne
            FROM enseigne AS e
            JOIN enseigne_has_activite AS eha ON eha.enseigne_idenseigne = e.idenseigne
            JOIN activite AS a ON a.idactivite = eha.activite_idactivite
            JOIN secteur AS s ON s.idsecteur = a.secteur_idsecteur
            WHERE idsecteur = ma variable id secteur
            AND contrat_pub = 'y'
            AND statut_idstatut != 3
Peut-être même voyez vous d'autres moyens de faire ?
sadkat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 10h02   #2
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Postez le plan d’exécution de votre requête que vous considérez comme "lente", ainsi que le descriptif de vos tables.

Les jointures étant la base des SGBDR, cela reste le moyen optimal de récupérer des données, à condition que :

1) Le modèle de données soit correct
2) Les index bien définis
3) Les requêtes bien écrites

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 11h04   #3
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 87
Points : 17
Points : 17
Merci de prendre le temps de me répondre ! mais euuh... Je me sens vraiment bête là...

Qu'est ce que le "plan d’exécution de ma requête" ?

Mon modèle est correct normalement, ma requête, je vous l'ai postée pour que vous puissiez en juger. Quant aux index, ma question est "Où les mettre ?"

Au cas où je me tromperais, voici une image tronquée de mon MRD (il manque quelques champs dans l'entité enseigne sur cette version)
sadkat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 11h10   #4
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,

pour avoir le plan d'exécution tu peux faire :

Code :
1
2
 
EXPLAIN SELECT BLABLA FROM TOTO ....
En gros, tu rajoutes le key word EXPLAIN devant ta requête SELECT.

Après si tu peux poster le résultat de SHOW CREATE TABLE pour tes tables, c'est bien aussi .
__________________
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 actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 11h19   #5
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 87
Points : 17
Points : 17
Merci merci Gizmo !!

Alors mon plan d’exécution est (désolé je ne sais pas comment vous présentez ça) :
Code :
1
2
3
4
1	SIMPLE	s	const	PRIMARY	PRIMARY	4	const	1	USING INDEX; USING TEMPORARY
1	SIMPLE	a	ref	PRIMARY,activite_FKIndex1	activite_FKIndex1	4	const	9	USING INDEX
1	SIMPLE	eha	ref	PRIMARY,enseigne_has_activite_FKIndex1,enseigne_has_activite_FKIndex2	enseigne_has_activite_FKIndex2	4	franchise_new.a.idactivite	4	USING INDEX
1	SIMPLE	e	eq_ref	PRIMARY,idenseigne,enseigne_FKIndex6	PRIMARY	4	franchise_new.eha.enseigne_idenseigne	1	USING WHERE
Et ma table :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE TABLE `enseigne` (
  `idenseigne` int(10) NOT NULL AUTO_INCREMENT,
  `cout_click_idcout_click` int(10) NOT NULL,
  `adresse_facturation_idadresse_facturation` int(10) DEFAULT NULL,
  `statut_idstatut` int(10) NOT NULL,
  `formule_idformule` int(10) DEFAULT NULL,
  `societe_idsociete` int(10) NOT NULL,
  `nom` varchar(250) DEFAULT NULL,
  `annee_creation` mediumtext,
  `nb_implantation` varchar(250) DEFAULT NULL,
  `investissement_total` varchar(250) DEFAULT NULL,
  `apport_chiffre` int(10) UNSIGNED DEFAULT NULL,
  `apport_affiche` mediumtext,
  `duree` mediumtext,
  `zone_chalandise` mediumtext,
  `presentation` text,
  `points_forts` text,
  `profil` text,
  `date_inscription` datetime DEFAULT NULL,
  `site` mediumtext,
  `locaux` enum('Y','N') DEFAULT NULL,
  `droit_entree` int(10) UNSIGNED DEFAULT NULL,
  `redevance` int(10) UNSIGNED DEFAULT NULL,
  `royalties` int(10) UNSIGNED DEFAULT NULL,
  `date_modification` datetime DEFAULT NULL,
  `activite_exacte` varchar(500) DEFAULT NULL,
  `contrat_pub` tinytext,
  `star` enum('n','y') DEFAULT NULL,
  `lib_photo1` varchar(255) DEFAULT NULL,
  `lib_photo2` varchar(255) DEFAULT NULL,
  `lib_photo3` varchar(255) DEFAULT NULL,
  `conversion_idconversion` int(11) DEFAULT NULL,
  PRIMARY KEY  (`idenseigne`),
  UNIQUE KEY `idenseigne` USING BTREE (`idenseigne`),
  KEY `enseigne_FKIndex1` (`adresse_facturation_idadresse_facturation`),
  KEY `enseigne_FKIndex2` (`societe_idsociete`),
  KEY `enseigne_FKIndex4` (`formule_idformule`),
  KEY `enseigne_FKIndex6` (`statut_idstatut`),
  KEY `enseigne_FKIndex7` (`cout_click_idcout_click`)
) ENGINE=InnoDB AUTO_INCREMENT=3253 DEFAULT CHARSET=latin1
Voilà en espérant que ça vous aide à m'aider ^^
sadkat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 12h27   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
La requête a l'air effectivement correctement optimisée.
Vous parlez de tri, mais celui-ci n'apparait pas dans votre requête.
Est-ce un tri via votre client ? Dans ce cas, c'est peut-être lui qui n'est pas très optimisé. Quelle est la volumétrie de votre retour de requête ?
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h17   #7
Futur Membre du Club
 
Inscription : décembre 2007
Messages : 87
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 87
Points : 17
Points : 17
Je me suis peut être mal exprimé, par tri je voulais parler de la clause "WHERE".
"Je trie mes marques par secteur".

Si vous me dites que tout est correct alors ça me va... Je viens de faire des tests.

Ce n'est pas vraiment cette requête qui ralentissait ma page, ce sont toutes les autres petites bidouillées... (ralalala les reprises de vieux code pour aller vite) Suis dégoutée d'y avoir passé autant de temps.

Merci beaucoup à ceux qui m'ont aidé
J'aurai au moins appris les EXPLAIN et les SHOW CREATE TABLE
sadkat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h50.


 
 
 
 
Partenaires

Hébergement Web