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 d'une requête


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut Optimisation d'une requête
    Bonjour,

    J'ai la requête suivante :

    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
    SELECT table_cmd_entetes.id_cmd_entete
    FROM table_cmd_entetes
    LEFT OUTER JOIN (
     
    SELECT id_cmd_entete, id_cmd_reglement
    FROM table_cmd_entetes_reglements
    WHERE id_trt
    BETWEEN 1
    AND 3
    GROUP BY id_cmd_entete
    ) AS table_cmd_entetes_reglements ON table_cmd_entetes.id_cmd_entete = table_cmd_entetes_reglements.id_cmd_entete
    LEFT OUTER JOIN (
     
    SELECT id_cmd_entete, id_cmd_entete_evenement
    FROM table_cmd_entetes_evenements
    WHERE id_cmd_entete_type_evenement =1
    AND id_trt
    BETWEEN 1
    AND 3
    ) AS table_cmd_entetes_evenements ON table_cmd_entetes.id_cmd_entete = table_cmd_entetes_evenements.id_cmd_entete
    WHERE id_operation = '2'
    AND table_cmd_entetes.id_trt
    BETWEEN 1
    AND 3
    AND cmd_ent_date > '2007-10-01'
    AND cmd_ent_statut = ''
    AND table_cmd_entetes_evenements.id_cmd_entete_evenement IS NULL
    AND table_cmd_entetes_reglements.id_cmd_reglement !=0
    Qui me donne avec l'option explain :



    Sachant que tous les champs commençant par id_xxxx sont des clés primaire ou des index

    Comment interpréter le explain et que faire pour optimiser la requête ?

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de omiossec
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2002
    Messages : 241
    Par défaut
    justement que te donne l'explain

  3. #3
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Explain me donne ce qu'il y a dans l'image que j'avais mis et que je remets ici :



    Mais tu ne la vois peut-être pas.

  4. #4
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    C'est peut-être mieux ainsi

    http://www.developpez.net/forums/att...1&d=1213725010
    image.JPG
    Images attachées Images attachées  

  5. #5
    Membre chevronné
    Avatar de omiossec
    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2002
    Messages : 241
    Par défaut
    Votre EXPLAIN montre que vous utilisé le type derived dans cette requête. Ce qui est sans doute l'une des pires situations.
    MySql n'a pas d'index pour effectuer le JOIN est donc est oblié de scanner l'ensemble des resultats. D'où sans doute des lenteurs.

    Par contre l'utilisation de tables temporaires pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id_cmd_entete, id_cmd_reglement
    FROM table_cmd_entetes_reglements
    WHERE id_trt
    BETWEEN 1
    AND 3
    GROUP BY id_cmd_entete
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id_cmd_entete, id_cmd_entete_evenement
    FROM table_cmd_entetes_evenements
    WHERE id_cmd_entete_type_evenement =1
    AND id_trt
    BETWEEN 1
    AND 3

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TEMPORARY TABLE  table_cmd_entetes_reglements 
    (id_cmd_entete INT,  id_cmd_entete_evenement INT,   INDEX  (id_cmd_entete_evenement, id_cmd_entete))
      ENGINE = MEMORY  SELECT id_cmd_entete, id_cmd_reglement
    FROM table_cmd_entetes_reglements
    WHERE id_trt
    BETWEEN 1
    AND 3
    GROUP BY id_cmd_entete;

  6. #6
    Membre éprouvé Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Par défaut
    Ce qui devrait me donner ?

    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
     
     CREATE TEMPORARY TABLE  table_cmd_entetes 
    (id_cmd_entete INT,   id_cmd_reglement INT,   INDEX  (id_cmd_entete, id_cmd_reglement))
      ENGINE = MEMORY
    SELECT id_cmd_entete, id_cmd_reglement
    FROM table_cmd_entetes_reglements
    WHERE id_trt
    BETWEEN 1
    AND 3
    GROUP BY id_cmd_entete;
    CREATE TEMPORARY TABLE  table_cmd_entetes_reglements 
    (id_cmd_entete INT,  id_cmd_entete_evenement INT,   INDEX  (id_cmd_entete_evenement, id_cmd_entete))
      ENGINE = MEMORY  SELECT id_cmd_entete, id_cmd_reglement
    FROM table_cmd_entetes_reglements
    WHERE id_trt
    BETWEEN 1
    AND 3
    GROUP BY id_cmd_entete;
    SELECT table_cmd_entetes.id_cmd_entete
    FROM table_cmd_entetes
    LEFT OUTER JOIN table_cmd_entetes ON table_cmd_entetes.id_cmd_entete = table_cmd_entetes.id_cmd_entete
    LEFT OUTER JOIN table_cmd_entetes_reglements ON table_cmd_entetes.id_cmd_entete = table_cmd_entetes_reglements.id_cmd_entete
    WHERE id_operation = '2'
    AND table_cmd_entetes.id_trt
    BETWEEN 1
    AND 3
    AND cmd_ent_date > '2007-10-01'
    AND cmd_ent_statut = ''
    AND table_cmd_entetes_evenements.id_cmd_entete_evenement IS NULL
    AND table_cmd_entetes_reglements.id_cmd_reglement !=0;
    DROP TABLE table_cmd_entetes;
    DROP TABLE table_cmd_entetes_reglements;

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

Discussions similaires

  1. Optimisation d'une requête
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2005, 18h21
  2. Optimisation d'une requête d'insertion
    Par fdraven dans le forum Oracle
    Réponses: 15
    Dernier message: 01/12/2005, 14h00
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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