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 :

Besoin conseils jointure sur table temporaire sans clés étrangères


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut Besoin conseils jointure sur table temporaire sans clés étrangères
    Bonjour,

    Je suis sous Linux, j'utilise MySQL 5.0.

    J'ai créé une table temporaire, je souhaite updater certains champs en les joignant à 2 autres tables :



    La commande que j'effectue actuellement est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update temp 
    join target on target_id = target_id_temp 
    join probe_has_target 
    on idtarget = target_idtarget and score = score_tmp 
    set gid_tmp = gid, idtarget_tmp = idtarget, idprobe_tmp = probe_idprobe
    La commande est assez lente, il faut dire que la table temporaire fait 200 millions de lignes et que probe_has_target fait 40 millions de lignes.

    Je pars du principe que la table temporaire ne doit pas avoir d'index, puisqu'elle doit être parcourue intégralement et que les autres tables nécessitent des index sur les champs servant dans les jonctions.

    Je souhaiterais donc avoir votre avis sur les points suivants :

    - une jonction est-elle à votre avis judicieuse dans la mesure où il n'y a pas de clés étrangères dans la table temporaire ? Ne serait-il pas plus judicieux d'utiliser WHERE à la place ?

    - mon idée de ne pas créer d'index sur la table temporaire tient-elle la route ? Devrais-je créer des index sur chaque champ servant dans la jointure pour toutes les tables (temp incluse) ?

    - pour accélérer la requête, puis-je utiliser plusieurs process (type threads en Perl ou Java) d'update sur la table temp, ou existe t'il un moyen d'optimiser ceci directement dans MySQL (paramètre de my.cnf, commande MySQL) ?

    En vous remerciant,

    C. Tobini

  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,

    Si mes souvenirs sont bons, JOIN tout seul équivaut à un CROSS JOIN (c'est-à-dire un produit cartésien complet). Remplace-le déjà par INNER JOIN .

    ced
    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
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse,

    Une spécificité de MySQL est que INNER JOIN et CROSS JOIN sont équivalents. Par ailleurs, sans précision, INNER JOIN est employé par défaut, ça ne va pas changer ma requête

    C. Tobini

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Points : 145
    Points
    145
    Par défaut
    Bonjour,
    Juste au sujet de la jonction, c'est vrai qu'il vaut mieux utiliser une clause WHERE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE temp 
    JOIN target ON target_id = target_id_temp 
    JOIN probe_has_target ON idtarget = target_idtarget 
    SET gid_tmp = gid, idtarget_tmp = idtarget, idprobe_tmp = probe_idprobe
    WHERE score = score_tmp
    Pour gagner un peu de temps, rajoute de simples alias pour préciser plus rapidement quelle table regarder.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 334
    Points : 123
    Points
    123
    Par défaut
    Bonjour et merci de la réponse,

    Apparement, il n'y a pas de grande différence entre le WHERE et le JOIN, pour peu que tout soit bien indexé

    Pour ce qui est de la lenteur de la requête, je me suis aperçu que, utilisant 2 index séparément, un seul était utilisé.

    J'ai donc créé un index sur 2 colonnes, ce qui ramène le nombre de match par requête à 1, ce que je m'attendais à avoir. La requète matchait en moyenne 16 lignes en n'utilisant qu'un seul index.

    Merci et bonne journée à tous,

    C. Tobini

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/11/2006, 23h04
  2. Réponses: 1
    Dernier message: 20/04/2006, 17h18
  3. [Global temporary]Transaction sur table temporaire
    Par tanatiel dans le forum Oracle
    Réponses: 9
    Dernier message: 12/10/2005, 16h38
  4. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07
  5. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56

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