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 :

Optimisation requête avec jointure et surtout ORDER BY


Sujet :

Requêtes MySQL

  1. #1
    Invité
    Invité(e)
    Par défaut Optimisation requête avec jointure et surtout ORDER BY
    Bonjour, Bonsoir

    Ma requête fonctionne correctement mais j'aimerais savoir si il est possible de diminuer le temps d’exécution.

    Lorsque j'utilise aucun ORDER BY, c'est extrêmement rapide 0.016 sec.
    Par contre avec un ORDER BY sur un datetime je suis à 0.312 sec et je suis OBLIGÉ de l'utiliser.

    Vous allez peut être me dire que c'est normal mais je trouve ça énorme car c'est seulement sur 10737 résultats.
    Avec un EXPLAIN, je vois bien que ma requête utilise une table temporaire (pour un DISTINCT) et un filesort (pour mon ORDER BY). C'est surement ce filesort qui prend du temps car le reste de la requête est déjà optimisé au mieux.
    J'ai quand même 13 jointures sur la tables mais bon elles sont toutes correctes (voir l'explain, j'ai remplacé le nom de mes fk par moi)

    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
    1	SIMPLE	E	ALL	PRIMARY...			10737	Using where; Using temporary; Using filesort
    1	SIMPLE	EG	ref	PRIMARY PRIMARY	8	moi	1	Using index; Distinct
    1	SIMPLE	G	eq_ref	PRIMARY	PRIMARY	3	moi	1	Distinct
    1	SIMPLE	SF	eq_ref	PRIMARY	PRIMARY	3	moi	1	Using where; Distinct
    1	SIMPLE	F	const	PRIMARY	PRIMARY	1	moi	1	Using index; Distinct
    1	SIMPLE	EA	ref	PRIMARY	PRIMARY	8	moi	1	Using index; Distinct
    1	SIMPLE	A	eq_ref	PRIMARY	PRIMARY	4	moi	1	Using index; Distinct
    1	SIMPLE	V	eq_ref	PRIMARY	PRIMARY	3	moi	1	Distinct
    1	SIMPLE	D	eq_ref	PRIMARY	PRIMARY	1	moi	1	Distinct
    1	SIMPLE	R	eq_ref	PRIMARY	PRIMARY	1	moi	1	Using index; Distinct
    1	SIMPLE	S	eq_ref	PRIMARY	PRIMARY	3	moi	1	Using index; Distinct
    1	SIMPLE	LA	eq_ref	PRIMARY	PRIMARY	1	moi	1	Using index; Distinct
    1	SIMPLE	LA2	eq_ref	PRIMARY	PRIMARY	1	moi	1	Using index; Distinct
    1	SIMPLE	T	eq_ref	PRIMARY	PRIMARY	4	moi	1	Using where; Distinct
    1	SIMPLE	TE	const	PRIMARY	PRIMARY	4	const	1	Using index; Distinct
    1	SIMPLE	H	ref	cle_etrangere	8	ref	1	Using index; Distinct
    Ma requête ressemble à ceci :
    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
    SELECT SQL_NO_CACHE STRAIGHT_JOIN 
    DISTINCT(colonne) 
    FROM table E 
    INNER JOIN table EG using (clé_primaire) 
    INNER JOIN table G using (clé_primaire) 
    INNER JOIN table SF using (clé_primaire) 
    INNER JOIN table  F using (clé_primaire)
    LEFT JOIN table EA using (clé_primaire) 
    LEFT JOIN table A using (clé_primaire)	
    LEFT JOIN table V using (clé_primaire) 
    LEFT JOIN table D using (clé_primaire) 
    LEFT JOIN table R using (clé_primaire)
    LEFT JOIN table S using (clé_primaire)
    LEFT JOIN table LA ON (D.clé_primaire) = (LA.clé_primaire)
    LEFT JOIN table LA2 ON (V.clé_primaire) = (LA2.clé_primaire)	
    LEFT JOIN table T using (clé_primaire)
    LEFT JOIN table TE using (clé_primaire)
    LEFT JOIN table H using (clé_primaire) 
    WHERE F.clé_primaire=1 
    AND T.clé_primaire= 2
    AND E.DATETIME > date_sub(CURDATE(), interval 1 day) 
    ORDER BY E.DATETIME DESC
    LIMIT 20
    Dans un premier temps j'ai essayé de créer un index sur ma colonne Datetime pour voir mais c'est encore pire...
    Précision : mes id sont bien unsigned , par contre mon id principal de ma table est un BigInt
    Auriez vous une solution à proposer ?
    Dernière modification par Invité ; 26/04/2013 à 01h47.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    l'index que vous avez testé était de cette forme ? : colonne_date desc, colonne_jointure

  3. #3
    Invité
    Invité(e)
    Par défaut
    salut punkoff,

    non j'ai juste testé un index simple sur la colonne de la date. J'essaye cela à mon retour. Tu peux me préciser ce que tu entends par colonne_jointure ?
    toutes les colonnes ?

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    les colonnes de jointures, pour cette requete.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 782
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    MySQL (comme PostGreSQL mais dans une moindre mesure) dispose d'un moteur de requête très limité en matière de jointure. Au delà d'une demi douzaine de jointure l'optimiseurs est incapable de s'en sortir correctement.. (pour PG la limite est à 12...).

    Si vous savez une base de données pour lequel vous aurez constamment ce genre de requête, alors passez à Oracle ou SQL Server, qui savent optimisez des dizaines de jointures sans aucun problème....

    Ce n'est pas pour rien que fabriquer un SGBDR, et notamment la partie optimisation c'est plus de 800 années/hommes en R&D...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Invité
    Invité(e)
    Par défaut
    @punkoff ; j'ai bien fait un index sur deux colonnes mais c'est pas mieux , c'est même moins bien 0.483 sec. J'avoue pas bien comprendre pourquoi c'est plus long.

    @SQLpro : cela m'est passé par la tête. Il me fallait une raison pour passer à un moteur plus pro et je crois bien que je l'ai trouvé.

    Merci pour vos réponses.

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, 10h08
  2. Optimisations requête avec jointures
    Par Superskunk dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/10/2009, 11h05
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  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, 15h38
  5. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50

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