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 :

Lenteur requête avec 17 LEFT JOIN. Comment l'optimiser?


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 50
    Points : 53
    Points
    53
    Par défaut Lenteur requête avec 17 LEFT JOIN. Comment l'optimiser?
    Bonjour,

    J'utilise mysql 5.0.27.
    J'ai un gros soucis avec une base de données mysql (interfacé en MS Access en ODBC). J'utilise la requête ci-dessous comme moteur de recherche:

    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
     
    SELECT DISTINCTROW documents.*
    FROM ((((((((((((((((
    documents LEFT JOIN audiovisuel ON documents.id = audiovisuel.xid_document)
    LEFT JOIN editeurs ON documents.xid_editeur = editeurs.id)
    LEFT JOIN collections ON documents.xid_collection = collections.id)
    LEFT JOIN pays ON documents.xid_pays = pays.id)
    LEFT JOIN lieuxedition ON documents.xid_lieuedition = lieuxedition.id)
    LEFT JOIN categoriemateriel ON documents.xid_categorie = categoriemateriel.id)
    LEFT JOIN typedocument ON documents.xid_type = typedocument.id)
    LEFT JOIN producteurs ON audiovisuel.xid_producteur = producteurs.id)
    LEFT JOIN doc_revue ON documents.id = doc_revue.xid_doc)
    LEFT JOIN revues ON doc_revue.xid_revue = revues.id)
    LEFT JOIN doc_public ON documents.id = doc_public.xid_doc)
    LEFT JOIN publics ON doc_public.xid_public = publics.id) 
    LEFT JOIN doc_mc ON documents.id = doc_mc.xid_doc) 
    LEFT JOIN motscles ON doc_mc.xid_mc = motscles.id)
    LEFT JOIN motscles AS motscles_3 ON doc_mc.xid_mc = motscles_3.id)
    LEFT JOIN motscles AS motscles_2 ON doc_mc.xid_mc = motscles_2.id)
    LEFT JOIN motscles AS motscles_1 ON doc_mc.xid_mc = motscles_1.id;
    Ca fonctionne mais ca met une bonne trentaine de secondes à s'exécuter...
    J'ai un peu plus de 22 000 documents, 166 000 enregistrements dans doc_mc.
    J'ai 19 tables différentes, 28,1Mo d'espace disque pour l'ensemble de la base de données. Comment pourrais-je optimiser cette requête? Je l'utilise en mode création sous Access pour permettre aux utilisateurs d'encoder leurs critères de recherche.
    J'ai joint en fichier attaché la structure de mes tables.
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Je crois qu'il y a pas de miracle. le LEFT JOIN oblige de parcourir chaque table et faire le test, combiné par le nombre de table, combiné par le DISTINCTROW, combiné par me nombre d'enregistrement, combiné au passage par le driver. Toute ces choses fait que les performance en prenne un sacré coup.
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2007
    Messages
    169
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 169
    Points : 149
    Points
    149
    Par défaut
    Je sais pas comment on pourrait l'optimiser, mais peut etre tu pourrais commencer(si ce n'est pas encore fait), de supprimer certaines parties de la requete, voir s'il y a un endroit ou il perd beaucoup plus de temps qu'a d'autres. Si y'en a, tu pourrais peut etre voir à mettre les champs directement dans la table document plutot que dans une autre table(quitte à faire un truc genre typedoc1, typedoc2...), enfin bon si t'es obligé d'en venir la ca serait vraiment moche... la dernière limite.
    Ou sinon plus simplement, si certaines jointures sont beaucoup plus lentes que d'autres, simplement les supprimer et mettre un lien pour afficher ces colonnes sur les docs sélectionnés.
    Et enfin, je sais pas du tout l'impact que ca a, mais si le Natural Join est plus rapide, renommer les champs concernés pour l'appliquer.
    Cartes Pokémon, Yugioh, Magic ?
    Communauté d'échange

Discussions similaires

  1. Requêtes avec plusieurs left Join créés dynamiquement
    Par bigbang84 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 24/10/2012, 17h06
  2. Requête avec 4 left JOIN, Problème de doublons
    Par pm.vial dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/10/2012, 17h59
  3. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  4. Creer une requete avec des LEFT JOIN et des GRO
    Par donbuz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2004, 15h53

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