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 :

Requête avec STRAIGHT_JOIN Trés lente


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 25
    Points
    25
    Par défaut Requête avec STRAIGHT_JOIN Trés lente
    Bonjour à tous,

    J'ai besoin de votre aide sur une requête dont son plan d'éxecution me paraît un peu bizarre :

    voici la req et son plan :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    explain SELECT STRAIGHT_JOIN B2.id_2 , A.value 
    FROM table1 A , table2 B2  
    WHERE A.id_iddim1 = B2.id_2;
    +----+-------------+-------+------+---------------+------+---------+------------------------------+---------+--------------------------+
    | id | select_type | table | type | possible_keys | key  | key_len | ref                          | rows    | Extra                    |
    +----+-------------+-------+------+---------------+------+---------+------------------------------+---------+--------------------------+
    |  1 | SIMPLE      | A     | ALL  | PRIMARY       | NULL | NULL    | NULL                         | 6288277 |                          |
    |  1 | SIMPLE      | B2    | ref  | ind1          | ind1 | 5       | mabase.A.id_iddim1           |       1 | Using where; Using index |
    +----+-------------+-------+------+---------------+------+---------+------------------------------+---------+--------------------------+
    Le probléme est que l'optimiseur fait le parcours de toute la table A même si elle est indexée :
    +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | Table                     | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | table1                    |          0 | PRIMARY  |            1 | id_iddim1   | A         |     6288277 |     NULL | NULL   |      | BTREE      |         |
    +---------------------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    Avez-vous une idée sur l'origine de ce problème ?

    Merci d'avance.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Prenez l'habitude d'écrire les jointures selon la norme SQL2, avec le mot clé INNER JOIN et pas avec des tables séparées par virgules.
    Sinon, la table B2 ne contient qu'une seule ligne ?
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    Bonjour CED,

    Tout a fait d'accord avec toi pour le SQL2

    Si non la table B2 contient 48720 lignes.


    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
    | ael   |          1 | ind1     |            1 | id_2        | A         |       48720 |     NULL | NULL   | YES  | BTREE      |         |
    +-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Déjà, il faudrait réécrire la requête correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXPLAIN SELECT B2.id_2 , A.value 
    FROM table1 A 
    STRAIGHT_JOIN table2 B2 ON A.id_iddim1 = B2.id_2;
    Et voir ce que ça donne.

    Ensuite, y a-t-il une raison particulière pour que vous utilisiez le STRAIGHT_JOIN ? Essayez la même requête avec un simple JOIN.
    Enfin, vous pouvez essayer de forcer l'utilisation d'index.
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2011
    Messages : 20
    Points : 25
    Points
    25
    Par défaut
    Merci ced pour ton retour


    Enfin nous allons utiliser un join comme tu l'as indiqué c'est beaucoup plus optimal.

    Merci.

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

Discussions similaires

  1. Requête avec SUM très complexe
    Par maxence64 dans le forum Requêtes
    Réponses: 5
    Dernier message: 23/12/2011, 11h18
  2. Réponses: 22
    Dernier message: 28/11/2010, 12h25
  3. Requête avec blob très lente.
    Par Alphonse87 dans le forum Hibernate
    Réponses: 2
    Dernier message: 14/08/2008, 11h32
  4. boot avec DD TRÈS lent
    Par troumad dans le forum Composants
    Réponses: 40
    Dernier message: 30/01/2007, 17h11
  5. Réponses: 2
    Dernier message: 04/03/2006, 10h47

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