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

MySQL Discussion :

optimisation requête et jointures [MySQL-5.5]


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 24
    Par défaut optimisation requête et jointures
    Bonjour,

    J'ai un problème avec une requête MySQL qui met de plus en plus de temps à s’exécuter, à mon avis à cause d'un select imbriqué, et ne trouve pas comment l'optimisé.

    La requête tape les bases suivantes :
    - claim => liste des sinistres
    - action => liste des actions sur les sinistres
    - user => liste des utilisateurs
    - memberClient => liste les clients membre d'un groupe
    - noteClient => liste les groupe clients disponible

    Le but de la requête est de récupéré une liste des sinistres contenant la dernière action créé dessus (id le plus haut) puis de le trier par date d'action prévu ascendant.

    La requête actuelle :
    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
     
    SELECT DISTINCT
    	a.idClaim as sin,
    	b.dateprevue as dateprevue,
    	c.nom_user as nom,
    	CASE WHEN d.codeMemberClient IS NOT NULL THEN e.color_noteClient
    		ELSE 'FFFFFF'
    	END as color
    	FROM  memberClient as d right join claim as a on a.clientCode = d.codeMemberClient
    	left join noteClient as e on d.noteMemberClient = e.id_noteClient,
    	action as b,
    	user as c
    	WHERE a.idClaim=b.nsinistrea
    	AND b.dateprevue = (
    		SELECT b.dateprevue
    		FROM action as b
    		WHERE b.nsinistrea = a.idClaim ORDER BY actionid DESC LIMIT 1
    	)
    	AND b.utilisateur=c.id_user
    	AND b.utilisateur IN ("liste des id user")
    	GROUP BY b.nsinistrea ORDER BY b.dateprevue ASC, b.actionid DESC
    Une idée ?

    Merci beaucoup d'avance !

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 220
    Billets dans le blog
    16
    Par défaut
    Bonjour popom31,

    ll faudrait commencer par effectuer un EXPLAIN de la requête.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 24
    Par défaut
    Bonjour fsmrel,

    Merci pour le retour, ça me redonne un petit espoir !

    La requête complète avec un explain et le résultat :

    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
    EXPLAIN SELECT DISTINCT
    	a.idClaim as sin,
    	a.clientName as nomclient,
    	a.clientCode as codeclient,
    	a.nContract as cont,
    	a.brand as marque,
    	a.model as modele,
    	a.comLastname as comm,
    	a.comName as com,
    	a.persistence as persis,
    	b.dateprevue as dateprevue,
    	b.typeaction as typeaction,
    	b.actionid as actionid,
    	c.nom_user as nom,
    	c.prenom_user as prenom,
    	CASE
        WHEN d.codeMemberClient IS NOT NULL THEN e.color_noteClient
    		ELSE 'FFFFFF'
    	END as color
    	FROM  memberClient as d right join claim as a on a.clientCode = d.codeMemberClient
    	left join noteClient as e on d.noteMemberClient = e.id_noteClient,
    	action as b,
    	user as c
    	WHERE a.idClaim=b.nsinistrea
    	AND b.dateprevue = 
    	(SELECT b.dateprevue
    	FROM action as b
        WHERE b.nsinistrea = a.idClaim ORDER BY actionid DESC LIMIT 1)
    	AND b.utilisateur=c.id_user
    	AND (a.state = '-1' OR a.persistence = '1')
    	AND b.utilisateur IN ('2','12','13','14','15','16','17','18','19','20','21','22','23','27')
    	GROUP BY b.nsinistrea ORDER BY b.dateprevue ASC, b.actionid DESC
    Nom : sql.PNG
Affichages : 349
Taille : 28,1 Ko

    Si je comprend le retour, la première étape boucle dans 26000 lignes et doit causer le problème ?

    C'était mon idée de la cause, je ne trouve pas comment le contourner.

    Merci

  4. #4
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 220
    Billets dans le blog
    16
    Par défaut
    D’après la 1re ligne de l’explain, MySQL commence par attaquer la table ACTION (b), qu’il joint à la table USER (a) selon la condition b.utilisateur=c.id_user.

    La colonne utilisateur de la table ACTION est-elle dotée d’un index ?

    Plus généralement, quels sont les index des tables ACTION, USER, CLAIM ?

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 24
    Par défaut
    Merci.
    Table ACTION : index "actionid"
    Table USER : index "id_user"
    Table CLAIM : index "idClaim"

  6. #6
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 220
    Billets dans le blog
    16
    Par défaut
    Pourriez-vous :

    1) créer un index pour la colonne utilisateur de la table ACTION, puis relancer l'explain ?

    2) créer un index sur la colonne nsinistrea de la table ACTION, puis relancer l'explain ?

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

Discussions similaires

  1. Optimisation requête avec jointure externe SQL Server
    Par ICEMAN_60 dans le forum Développement
    Réponses: 2
    Dernier message: 28/11/2011, 11h08
  2. Optimisations requête avec jointures
    Par Superskunk dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/10/2009, 12h05
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 16h38
  4. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 16h38
  5. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 17h50

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