IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Vue et/ou Index ?


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Par défaut
    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)

  4. #4
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 428
    Par défaut
    Salut,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Par défaut
    Merci merci Gizmo !!

    Alors mon plan d’exécution est (désolé je ne sais pas comment vous présentez ça) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ^^

  6. #6
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    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 ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 93
    Par défaut
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme de la vue de l'index
    Par florianjoy54 dans le forum Zend_Db
    Réponses: 3
    Dernier message: 26/07/2011, 15h44
  2. Réponses: 3
    Dernier message: 25/10/2006, 17h45
  3. [Oracle 9] Vue materialisée indexée et optimisation
    Par scornille dans le forum Oracle
    Réponses: 4
    Dernier message: 18/11/2005, 15h11
  4. [9i] Vue, Performances et Index
    Par nuke_y dans le forum Oracle
    Réponses: 5
    Dernier message: 27/06/2005, 10h47
  5. [DB2] Question sur les index et les vues
    Par ahoyeau dans le forum DB2
    Réponses: 1
    Dernier message: 14/03/2005, 08h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo