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 :

Quels index pour cette requete ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut Quels index pour cette requete ?
    Je ne suis pas un spécialiste des index, pour cette requête, quels index sont conseillés ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     select
     dossier.DNUMERO as dossierNotreReference
     from dossier left join dogest on
            dogest.NUMDOS=dossier.DNUMERO
        and dogest.RANGCODEPOS=1
        and dogest.DATEHFINAFFECT IS NULL
        and dogest.societe_id = dossier.societe_id
                      INNER JOIN transposition on dogest.CODEPOS = transposition.codepos
                      and transposition.societe_id = dogest.societe_id
                      and transposition.visibilite = 1
     where dossier.societe_id =9 and (dossier.DNUMCLI in ( '   532')) order by dossierNotreReference ASC  LIMIT 0,5
    Sachant que j'ai :
    - 50000 lignes dans dossier
    - 50000 lignes dans dogest
    - 100 lignes dans transposition

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    D'abord, un peu de lecture sur les index.

    Ensuite, j'ai l'impression que tu mélanges les conditions de jointures et la restriction à opérer sur les données.
    Je ferais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select dossier.DNUMERO as dossierNotreReference
    from dossier 
    left join dogest on dogest.NUMDOS = dossier.DNUMERO and dogest.societe_id = dossier.societe_id
      INNER JOIN transposition on dogest.CODEPOS = transposition.codepos and transposition.societe_id = dogest.societe_id
    where dossier.societe_id =9 
      and dossier.DNUMCLI in ( '   532')
      and dogest.RANGCODEPOS=1
      and dogest.DATEHFINAFFECT IS NULL
      and transposition.visibilite = 1
    order by dossierNotreReference ASC  
    LIMIT 0,5
    Enfin, la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI in ( '   532')
    est bizarre ! Elle équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI = '   532'
    Tu ne voudrais pas plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI LIKE '%532'
    ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 14
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    D'abord, un peu de lecture sur les index.
    merci pour le lien
    Citation Envoyé par CinePhil Voir le message
    Ensuite, j'ai l'impression que tu mélanges les conditions de jointures et la restriction à opérer sur les données.
    Je ferais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select dossier.DNUMERO as dossierNotreReference
    from dossier 
    left join dogest on dogest.NUMDOS = dossier.DNUMERO and dogest.societe_id = dossier.societe_id
      INNER JOIN transposition on dogest.CODEPOS = transposition.codepos and transposition.societe_id = dogest.societe_id
    where dossier.societe_id =9 
      and dossier.DNUMCLI in ( '   532')
      and dogest.RANGCODEPOS=1
      and dogest.DATEHFINAFFECT IS NULL
      and transposition.visibilite = 1
    order by dossierNotreReference ASC  
    LIMIT 0,5
    Oui, c'est surement mieux comme ca.
    Citation Envoyé par CinePhil Voir le message
    Enfin, la partie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI in ( '   532')
    est bizarre ! Elle équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI = '   532'
    Tu ne voudrais pas plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dossier.DNUMCLI LIKE '%532'
    ?
    Non, c'est une requête qui est générée par un programme, cette clause peut prendre plusieurs arguments, ce qui justifie le IN.
    Sinon, pour ma question du début, sur les index ? Pendant que je lis ton lien

  4. #4
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    A la louche je suggèrerais:

    dogest.NUMDOS, dossier.DNUMERO, transposition.codepos, dogest.CODEPOS et tous societe_id sont de bon candidats. dogest.RANGCODEPOS aussi s'il est assez sélectif. J'envisagerais aussi (ou en remplacement) des indexes composés sur ces champs avec societe_id en première partie. Après les indexes à chaque bouts d'une relation ne peuvent servir en même temps donc il est possible de n'en garder qu'un, mais comme les volumes semblent raisonnables autant peut-être accepter leur coùt et laisser MySQL se débrouiller avec.


    Il est possible que (dossier.societe_id, dossier.DNUMERO) aide. Idéalement il faudrait passer par un index pour le tri et pouvoir faire jouer le LIMIT sans avoir à récupérer les résultats qui seront exclus, mais je ne sais pas si ça marchera.

Discussions similaires

  1. quel index pour ma requete
    Par LampeRouge dans le forum Débuter
    Réponses: 3
    Dernier message: 01/02/2010, 15h58
  2. [OCI] une erreur dans l'execution pour cette requete SQL
    Par Abdelkaoui dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 14/09/2007, 12h29
  3. [Joomla!] Quel CMS pour cette activité ?
    Par greginou dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 02/02/2007, 15h14

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