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

Langage SQL Discussion :

[MySQL] performance des jointures


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    259
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 259
    Points : 195
    Points
    195
    Par défaut [MySQL] performance des jointures
    Bonjour!
    Quand j'étais petit (j'étais un abruti!), j'ai créé des tables, puis des requêtes. J'y suis allé en bourrin, et je n'ai jamais utilisé les jointures.
    Maintenant que je suis grand (je suis le roi des glands!), j'essaye de m'éduquer un peu et ne plus me conduire en sauvage. J'ai donc lu quelques articles, des petits tuto (avant de m'attaquer au vraiment très gros de SQLPro), mais je dois bien avouer que je reste hermétique
    J'ai donc effectué un test.
    J'ai deux tables : une table film, où j'ai, entre autres, les champs id_film et titre_vf. J'ai une table sortie, où j'ai comme champs, id_film, annee (pour différencier les films originaux des remake... enfin bref)
    Je veux donc, dans ce cas-là, trouver l'année de sortie du film au cinéma.
    Quand j'étais petit, je faisais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT O.id_oeuvre, titre_vf, annee
    FROM tbl_oeuvre O, tbl_doc D
    WHERE O.id_oeuvre = D.id_oeuvre
    LIMIT 0 , 30
    Avec MySQL 4.0.15, cette requête met 0.0012 seconde en moyenne pour s'exécuter.
    Maintenant que je suis grand, je crois qu'il faut que je fasse ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT O.id_oeuvre, titre_vf, annee
    FROM tbl_oeuvre O
    LEFT JOIN tbl_doc D ON O.id_oeuvre = D.id_oeuvre
    LIMIT 0 , 30
    Toujours avec MySQL 4.0.15, cette requête met 0.0235 seconde en moyenne.
    Euh...
    Bien sûr, c'est un exemple tout bête. Etant donné que je n'y connais pas grand chose, je n'ai pas tenté les grosses requêtes à 5 tables pour pas trop me perdre. Donc je ne sais pas si les jointures sont plus rapides à ce moment là ou pas.
    Mais bon, ma question est donc : à quel moment utiliser les jointures? Etant donné que là, ca met "beaucoup" plus de temps pour récupérer les données pour un petit exemple, en sera-t-il de même pour les gros exemple??
    Parce que là, je dois avouer que ça m'encourage pas vraiment à me torturer le cerveau
    Merci pour vos réponses.
    Ciao.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2004
    Messages : 140
    Points : 166
    Points
    166
    Par défaut
    Bonjour,

    Pour information dans les deux cas tu utilises une jointure.

    Les deux requêtes ne sont pas identiques. Pour pouvoir les comparer il faut que tu remplace ta deuxième requête par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT O.id_oeuvre, titre_vf, annee 
    FROM tbl_oeuvre O INNER JOIN tbl_doc D ON O.id_oeuvre = D.id_oeuvre 
    LIMIT 0 , 30
    Pour avoir plus d'information recherche "jointure" et "jointure externe"

  3. #3
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Les jointures sont l'essence même du relationnel ...
    Pour qu'une jointure soit performante il faut avoir des index sur les prédicats de jointure, c'est aussi simple que cela ...

  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
    Comme le dit Luc, tu compares une jointure à gauche avec une jointure de type inner, ca n'a rien à voir !

    et comme il le dit également, le WHERE X=Y, c'est une jointure de type inner join. Donc logiquement tu dois avoir sensiblement le même temps encore que sur des temps ci courts, la premiere exécution va monter des données en cache que va utiliser la seconde....

Discussions similaires

  1. [MySQL] Faire des delete MySQL avec une jointure
    Par Voyageur Du Net dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 23/07/2010, 08h39
  2. Performance des requêtes - jointure par fonctions
    Par denevers dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 07/12/2007, 15h11
  3. performance MySql avec des requetes complexes
    Par khadir dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/12/2007, 16h40
  4. Réponses: 6
    Dernier message: 01/12/2007, 22h28
  5. LYCOS ET MYSQL - Intégrer des images dans une base!
    Par archeo dans le forum Installation
    Réponses: 3
    Dernier message: 06/04/2004, 13h45

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