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 :

Exécution trop longue


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 23
    Points : 28
    Points
    28
    Par défaut Exécution trop longue
    Bonjour,

    J'ai un problème avec ma requête qui met trop longtemps à s’exécuter (~4s)

    4 tables :
    abonne{#id_abonne, nom, email, id_dept}
    departement{#id_dept, nom_dept}
    abonne_groupe{id_abonne, id_groupe}
    groupe{#id_groupe, nom groupe}

    un abonné est rattaché à un departement,
    un abonné appartient à un ou plusieurs groupes.


    Voila ce que je veux que ma requête fasse, qu'elle fait actuellement mais à la vitesse d'une limace:
    Récupérer les abonnés (id, nom, email) avec le nom du département associé, et les groupes auxquels chaque abonne appartient (idéalement sous la forme : "nom_groupe, nom_groupe, nom_groupe"

    LA REQUÊTE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT ag.id_abonne, ab.nom, ab.email, ab.nom_dept,  GROUP_CONCAT(g.nom_groupe  SEPARATOR ', ') AS groupes
    FROM
        (SELECT a.id_abonne, a.nom, a.email, d.nom_dept, a.is_valid
            FROM abonne a
            LEFT OUTER JOIN departement d ON d.id_dept = a.id_dept
        ) as ab,
    abonne_groupe ag
    LEFT OUTER JOIN groupe g ON g.id_groupe = ag.id_groupe
    WHERE ag.id_abonne = ab.id_abonne            
    GROUP BY ag.id_abonne
    ORDER BY ab.email
    Le point clé ici c'est le GROUP BY / GROUP_CONCAT qui je pense ralentit la requête

    Je pourrais facilement passer par 2 requêtes
    (select abonne + departement).
    Un parcour (Select group where id_abonne).

    Mais je n'aime pas la facilité.


    Donc ma question est : puis-je optimiser cette requête? si oui comment ?


    Merci de votre aide.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    La même requète sans la sous requète :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id_abonne, nom, email, nom_dept, GROUP_CONCAT(nom_groupe SEPARATOR ', ') AS groupes
    FROM abonne
    LEFT OUTER JOIN departement  USING(id_dept)
    LEFT OUTER JOIN abonne_groupe USING(id_abonne)
    LEFT OUTER JOIN groupe USING(id_groupe)
    GROUP BY id_abonne, nom, email, nom_dept
    ORDER BY email
    Que donne l'explain de ta requète ?

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    D'après les règles que vous avez indiquées, vous pouvez aussi remplacer vos jointures externes par des jointures internes

Discussions similaires

  1. Réponses: 17
    Dernier message: 12/10/2011, 16h31
  2. Exécution trop longue d'une requête
    Par lodan dans le forum Requêtes
    Réponses: 5
    Dernier message: 13/10/2006, 15h34
  3. CGI exécution trop longue
    Par crochepatte dans le forum Web
    Réponses: 6
    Dernier message: 23/08/2006, 15h11
  4. CGI exécution trop longue
    Par crochepatte dans le forum Apache
    Réponses: 3
    Dernier message: 18/08/2006, 15h02
  5. Requete trop longue à exécuter
    Par fguilbert dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/06/2006, 10h33

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