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 :

Problème de performance avec LEFT OUTER JOIN


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Points : 66
    Points
    66
    Par défaut Problème de performance avec LEFT OUTER JOIN
    Bonjour,
    J'ai une table "BOOK" qui contient environ 5000 records et une table "ARTICLE" qui en contient 4500.

    BOOK contient les champs :
    bookid
    titre


    ARTICLE contient les champs :
    articleid
    bookid
    codearticle


    Je fais la requête suivante :
    SELECT book.*, article.codearticle
    FROM book
    LEFT OUTER JOIN article
    ON book.bookid = article.bookid
    ORDER BY book.title


    Cette requête prend 60 secondes à s'exécuter. Si j'enlève le left outer join, elle en prend moins d'une seconde !
    Note : J'utilise un LEFT OUTER JOIN car je veux que la requête me retourne NULL dans le champ codearticle pour les records de la table BOOK qui ne respectent pas la clause "book.bookid = article.bookid".

    J'espère être suffisamment claire. Est-ce que quelqu'un sait comment résoudre ce problême ?

    Merci par avance pour votre aide.

    Julei

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    effectivement je viens de faire un test chez moi.

    Ta requete dure 50 secondes chez moi..

    Je savais que le left outer join était très peu performant, en plus le tri... Mais je pensais pas que Mysql était si peu performant sur ce genre de requete parce que la volumétrie est très faible ici.

    Quand je fais un explain, effectivement, comme je m'y attendais, il balaie les 2 tables via un Full Scan et un tri sur la premiere table... Mais là 50 secondes pour faire ca c'est ahurrissant

    Si un expert Mysql peut intervenir ca m'intéresse de comprendre aussi

  3. #3
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut Re: Problème de performance avec LEFT OUTER JOIN
    Citation Envoyé par jgfa9
    Si j'enlève le left outer join
    C'est à dire ? En ne laissant que le SELECT sur la table book ?

    Est-ce qu'il y a des index sur article.bookid et titre ?

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    Si il y a des temps de réponse comme ca. c'est qu'il n'y pas d'index sur la colonne bookid de la table article...

    L'index sur la table book ne sert à rien étant donné qu'on fait une outer join à gauche donc il est obligé de tout balayer.

    faut en mettre un....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create index article$bookid on article(bookid);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos reponses. Je ne suis pas familiere avec les index (d'ailleurs, si vous connaissez un bon tutoriel a ce sujet, je suis preneuse...) mais je vais essayer la suggestion consistant a mettre un index sur la table article.
    Je vous tiens au courant. Encore merci.
    Julie

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    une clé primaire n'est elle pas automatiquement indéxée ??

    ps: je suis sous innodb et je rencontre le même problème...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    199
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 199
    Points : 66
    Points
    66
    Par défaut
    Bookid n'est pas une clé primaire de la table article...
    En tout cas, cette solution fonctionne parfaitement : la requête prend maintenant moins d'une seconde a s'effectuer.
    Merci encore !
    Julie

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

Discussions similaires

  1. Problème avec LEFT OUTER JOIN
    Par Drakkhen72 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/08/2008, 13h22
  2. problème avec LEFT OUTER JOIN
    Par tofque dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/03/2008, 11h57
  3. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40
  4. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  5. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07

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