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 :

Optimsation Requete MySQL


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut Optimsation Requete MySQL
    Bonjour,

    J'ai besoin de votre aide afin d'optimiser ma requete. Elle me donne le résultat voulu mais prend 50 secondes à s'effectuer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT clients.id, clients.raisonSociale, IFNULL(CONCAT(commerciaux.nom, ' ', commerciaux.prenom), clients.commercial) as commercial, 
        (COUNT(produitsmultifonctions.clientId) + COUNT(produitstelecopieurs.clientId)) as nb 
        FROM clients 
        LEFT JOIN commerciaux ON clients.commercial=commerciaux.id 
        LEFT JOIN produitsmultifonctions ON clients.id=produitsmultifonctions.clientId 
        LEFT JOIN produitstelecopieurs ON clients.id=produitstelecopieurs.clientId 
        GROUP BY produitsmultifonctions.clientId, produitstelecopieurs.clientId 
        ORDER BY clients.raisonSociale ASC;
    Merci

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 24
    Points
    24
    Par défaut
    A vue de nez, je mettrais clients.id dans le GROUP BY au lieu des deux autres colonnes (même si je m'attends à un résultat un peu différent). Est-ce que tu peux :
    - nous dire en français ce que tu veux obtenir ;
    - nous donner le schéma des tables (pas forcément tout mais au moins les tables et colonnes concernées, avec les index) ;
    - ce que donne la commande EXPLAIN pour ta requête ?

  3. #3
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    Je dispose d'une table 'clients' contenant les colonnes id, raisonSociale, commercial (contenant l'id du commercial dans la table commerciaux)

    Je dispose de deux autres tables produitsmultifonctions, produitstelecopieurs ayant une colonne clientId faisant référence à id dans la table clients, destinées à stocker tous les produits des clients

    Je souhaite récupérer la liste de tous les clients en affichant leur raison sociale, le commercial et le nombre de produits de ces clients (somme des produits dans 'produitsmultifonctions et produits telecopieurs).

    Je ne sais pas si je suis assez claire

    Merci
    Images attachées Images attachées      

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 24
    Points
    24
    Par défaut
    Tu fais des jointures sur des colonnes de types différents. Cela oblige à faire des conversions pour réaliser les jointures (ça ralentit ta requête et ça peut donner des résultats faux).
    Dans la table clients, la colonne commercial devrait avoir le même format que la colonne id de la table commerciaux (int).
    Dans les tables produitsmultifonctions et produitstelecopieurs, les colonnes clientId devrait avoir le même format que la colonne id de la table clients (int).

    Est-ce que tu as des index sur les colonnes commercial et clientId ?

  5. #5
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Merci de me répondre

    Non je n'ai pas d'index sur mes tables

    Je dispose de format different car si par exemple un commercial est supprimé j'envoie dans ma colonne commercial un concat du nom et du prenom du commercial avant de supprimer l'enregistrement
    Comment puis je faire dans ce cas là ?

  6. #6
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Je viens de tester ma requete avec des colonnes de même type mais le résultat de ma requete prends autant de temps

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    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 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par snay13 Voir le message
    Je dispose de format different car si par exemple un commercial est supprimé j'envoie dans ma colonne commercial un concat du nom et du prenom du commercial avant de supprimer l'enregistrement
    Grosse erreur !

    Un bon identifiant est invariable.

    Non je n'ai pas d'index sur mes tables
    Grosse erreur qui explique sans doute la lenteur de la requête.
    À lire : Que faut-il indexer ?

    Quant à la requête, elle est totalement fausse !
    À lire : http://sqlpro.developpez.com/cours/sqlaz/ensembles/
    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 !

  8. #8
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    Oui effectivement j'ai crée des index sur clientId dans mes 2 tables et le temps de réponse tombent à 0.031s
    Merci

    Sinon comment faire si je dispose dans me table d'une référence à une autre table que je dois supprimer mais garder la valeur (exemple du Commercial).

  9. #9
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 17
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par snay13
    Sinon comment faire si je dispose dans me table d'une référence à une autre table que je dois supprimer mais garder la valeur (exemple du Commercial).
    Si je lis bien ce que tu as écrit, tu veux en même temps conserver et supprimer une valeur ? ...

    Une idée serait de ne jamais supprimer tes commerciaux mais d'ajouter une colonne dans la table pour indiquer s'ils sont toujours en activité ou non.

  10. #10
    Membre habitué Avatar de snay13
    Homme Profil pro
    Inscrit en
    Juin 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2009
    Messages : 236
    Points : 166
    Points
    166
    Par défaut
    C'est ce que j'avais pensé au début mais j'avais peur d'avoir une table trop importante au fur et à mesure

    Merci à vous deux pour votre aide

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

Discussions similaires

  1. résultat d'une requete mysql
    Par noinneh dans le forum MFC
    Réponses: 4
    Dernier message: 03/03/2005, 17h54
  2. arret requete mysql
    Par titiyo dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/10/2004, 18h40
  3. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 11h36
  4. Requete MySql pour Mambo Open source
    Par azman0101 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/06/2004, 10h34

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