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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 averti
    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
    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 éclairé 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
    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 averti
    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
    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 éclairé 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
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  7. #7
    Membre éclairé 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
    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

+ 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, 16h54
  2. arret requete mysql
    Par titiyo dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/10/2004, 17h40
  3. Problème sous requete MySQL
    Par gavelin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/07/2004, 10h36
  4. Requete MySql pour Mambo Open source
    Par azman0101 dans le forum Requêtes
    Réponses: 2
    Dernier message: 22/06/2004, 09h34

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