éviter le LEFT JOIN (performance)

éviter le LEFT JOIN (performance) - SQL/NoSQL - Programmation

Marsh Posté le 07-10-2004 à 13:54:23    

Bonjour,
 
voici mon problème:
pour simplifier, j'ai deux tables:
demande et evenement (relation 0,n et 1,1 : relation de type père-fils,
une demande peut avoir plusieurs 'evenement' mais un 'evenement' qu'une
seule 'demande').
 
maintenant je voudrais afficher tous les enregistrements des tables
demande et evenement sous la forme d'un seul tableau, et voila ou ça
coince :
1)
si je fais:
SELECT demande.iddemande,commentaireevenement FROM demande,evenement WHERE
demande.iddemande=evenement.iddemande
 
la requête est très rapide, mais si la demande n'a pas d'événement alors
les enregistrement correspondant ne seront pas affiché
 
exemple d'affichage:
iddemande|commentaireevenement
3       | blabla
7       | titi
 
donc il faut faire:
2)
SELECT demande.iddemande,commentaireevenement FROM demande LEFT JOIN
evenement ON demande.iddemande=evenement.iddemande
 
exemple d'affichage:
iddemande|commentaireevenement
1       | (null)
2       | (null)
3       | blabla
4       | (null)
5       | (null)
6       | (null)
7       | titi
 
la ça marche bien MAIS le problème c'est que la requête est très lente, et
pourtant je n'ai que 1400 enregistrements dans 'demande' et environs 500
'evenement' !!!!
j'utilise très souvent cette requête sur mon site du coup le site est lent
non pas à cause de l'html généré mais à cause des temps de réponse de la
requête. précision importante: le serveur n'est pas une charrette!!
 
Je suis certain qu'il est possible de beaucoup mieux.
 
 
Merci beaucoup d'avance pour vos réponses!! 3 jours que je bloque :(


---------------
Patrimoine et Architecture à Strasbourg http://www.archi-strasbourg.org
Reply

Marsh Posté le 07-10-2004 à 13:54:23   

Reply

Marsh Posté le 07-10-2004 à 15:07:49    

Décris les index que tu as sur ces 2 tables, parce que pour si peu de lignes, ça devrait être instantané.

Reply

Marsh Posté le 07-10-2004 à 16:59:42    

Merci Beegee: QUASIMENT RESOLU !
Voici la description des tables avant intervention :
 
DESC evenement
 
idEvenement int(6)   PRI NULL auto_increment  
idDemande int(11)     0    
dateEvenement date YES   NULL    
idTypeEvenement tinyint(3) YES   NULL    
commentaireEvenement varchar(255) YES   NULL    
 
DESC demande
idDemande int(10) unsigned   PRI NULL auto_increment  
idTransaction tinyint(3) unsigned     0    
idPersonne int(10) unsigned     0    
idUser tinyint(3) YES   0    
dateDemande date     0000-00-00    
idTypebien tinyint(3) unsigned YES   NULL    
nbPieceDemande tinyint(3) unsigned YES   NULL    
budgetDemande int(10) unsigned YES   NULL    
superficieDemande int(10) unsigned YES   NULL    
villeDemande int(11) YES   NULL    
idQuartier smallint(5) unsigned YES   NULL    
lieuDemande varchar(255) YES   NULL    
descriptifDemande text YES   NULL    
commentaireDemande text YES   NULL    
idProfilDemande tinyint(3)     0    
idStatutDemande tinyint(3)     0    
 
-----------------------------------------
Après mon intervention, j'ai rajouté un index sur iddemande dans la table evenement, et maintenant ça booste enfin!!
 
MERCI mille fois :)
Cependant j'aurais quand même voulu savoir si il est possible de faire la même chose sans utilise LEFT JOIN ? ou alors est ce que cela est quand même une fonction qui est conseillé (voir obligatoire) dans un pareil cas de figure ?


---------------
Patrimoine et Architecture à Strasbourg http://www.archi-strasbourg.org
Reply

Marsh Posté le 07-10-2004 à 22:49:51    

C'est pour ça que les jointures externes existent ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed