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 :

left join multiple sur grosses tables


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut left join multiple sur grosses tables
    Bonjour,

    Je suis à la recherche d'un petit conseil concernant des jointures de tables.
    Je fais une appli php-mysql. Une partie de cette appli exécute des requêtes assez balaises. Cad que je vais chercher des champs dans différentes tables assez volumineuses 4000-7000 enregistrements avec des joins. Biensur je limite les résultats avec des where mais j'arrive quand même à des retours de 3-4000 enregistrements à afficher dans IE... no comment, je peux pas séparer en pages, les utilisateurs préfèrent tout avoir sous les yeux d'un coup. Mais par contre ca rame au taquet, 8 minutes pour renvoyer les résultats.
    Pour les jointures, je réalise des "left join". Ma question est donc "est-ce que l'ordre des joins est important ?". J'entends par la que je commence par joindre les tables où mon where s'applique.
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut Re: left join multiple sur grosses tables
    Une petite révision s'impose:

    L'intérêt du LEFT JOIN (ou LEFT OUTER JOIN) est de retourner NULL s'il n'y a pas de correspondance dans la table de droite, donc cette opération est non commutative. Par contre, si tu as toujours une correspondance entre les 2 tables liées, alors il vaut mieux utiliser un INNER JOIN.

    En effet, avec un INNER JOIN, l'opération est commutative et il me semble que MySQL effectue certaines optimisations en fonction du nombre d'enregistements renvoyés par la table (en commençant par la table qui renverra le moins d'enregistrements).

    Dans le doute, commence par les table où le WHERE risque d'être le plus restrictif et remplace tes LEFT JOIN par des INNER JOIN (à moins que tu aies un réel besoin d'avoir un LEFT JOIN, mais puisque que tu parles d'inverser l'ordre de tes jointures, j'en doute)

    Aussi, utilise des index sur certaines colonnes de tes tables, si ce n'est pas déjà fait.

    Pour plus d'info, tu as toute la partie 7.2 de la doc MySQL:
    http://dev.mysql.com/doc/refman/5.1/en/query-speed.html

    Voilà.

    Par contre, je trouve ça aberrant de vouloir afficher plusieurs Mo de données avec IE... (ah, ces utilisateurs !). Sinon, à défaut d'afficher sur plusieurs pages, pense à afficher en plusieurs tableaux (pour ne pas attendre que tout s'affiche à la fin, pour avoir un rappel des entêtes, etc.)
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    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
    ca reste malgré tout de très faibles volumétries.

    Mais en faisant des tables scans ( cas le pire : pas d'index sur les bonnes colonnes), je suis pas convaincu que parcourir 8000 lignes prennent 8 mns. Meme si on avait 800000 lignes, ca prendrait pas autant de temps.

    Je pense que ton probleme est plus dans la génération de ta page html.

    Peux tu donner ta requete et l'as tu exécuter sous Mysql directement?

    Pour savoir ou placer tes index, fais un explain dessus.

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par gregory.broissard
    Je pense que ton probleme est plus dans la génération de ta page html.
    Tout à fait d'accord: plusieurs milliers d'enregistrements auxquels il faut rajouter les éléments de mise en page, ça fait tout de suite plusieurs Mo. IE rame à mort...
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Merci beaucoup pour votre aide.
    Je pars de la société ce soir donc je me fais plus trop de soucis. En tout cas ca tourne correctement après quelques modifs.
    Vos infos me serviront de toute manière pour la suite.
    Bonne journée

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Citation Envoyé par hn2k5
    Merci beaucoup pour votre aide.
    Je pars de la société ce soir donc je me fais plus trop de soucis.
    Content de partir?
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 328
    Points : 695
    Points
    695
    Par défaut
    Un peu que je suis content!! lol
    Mais ces 2 mois m'ont filé envie de bosser... pour un moment messieurs les employeurs !!
    J'ai peut-être un autre job en prévision en plus, j'attends des nouvelles.
    en JAVA ou je maitrise un peu moins...

    A bientôt donc sur le forum Java

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

Discussions similaires

  1. Count multiple sur même table et join
    Par bouket dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/11/2011, 16h42
  2. Api Criteria left join fetch sur plusieur table
    Par makroute dans le forum Hibernate
    Réponses: 1
    Dernier message: 16/05/2011, 11h36
  3. Relation gauche (left join) prob sur serveur
    Par Rocknacro dans le forum Requêtes
    Réponses: 1
    Dernier message: 13/02/2007, 11h57
  4. Besoin d'aide pour requête sur grosse table
    Par Fabouney dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/01/2006, 09h01
  5. select multiple sur plusieurs tables
    Par syl2095 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/12/2004, 15h48

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