Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/05/2008, 11h34   #1
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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 :
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 11h43   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 408
Points : 6 408
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
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 14h06   #3
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/05/2008, 15h36   #4
Membre habitué
 
Inscription : septembre 2002
Messages : 140
Détails du profil
Informations forums :
Inscription : septembre 2002
Messages : 140
Points : 118
Points : 118
Bonjour,
Juste au sujet de la jonction, c'est vrai qu'il vaut mieux utiliser une clause WHERE :

Code :
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.
papa6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2008, 11h56   #5
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
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
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h37.


 
 
 
 
Partenaires

Hébergement Web