JeuWeb - Crée ton jeu par navigateur
fumer un joint ! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : fumer un joint ! (/showthread.php?tid=1700)

Pages : 1 2


fumer un joint ! - Nel Morane - 02-09-2007

Oui, j'avoue, je l'ai cherché loin ce titre.

Mais recentrons sur une question très simple que je me pose :

Dans l'absolu, est-il préférable de créer une requête avec une jointure ou 2 sans ?


RE: fumer un joint ! - Nessper - 02-09-2007

^^
Assurément 1 seule requête avec une jointure.


RE: fumer un joint ! - Sephi-Chan - 02-09-2007

Oui, il ne faut pas hésiter à se servir des outils conférés par le système de base de données.


Sephi-Chan


RE: fumer un joint ! - Amrac - 03-09-2007

J'ai constaté des résultats mitigés, pas réellement d'amélioration de vitesse avec l'ajout de jointure. (même si ce n'est pas plus lent)

L'interet est peu etre plus important lorsque les scripts et la base de données sont sur des serveurs différents, sinon les résultats sont médiocres comparé aux 'on dit'. (Testé sur des table de 7 000 et 15 000 entrées, devant affiché 10 résultat seulement)


RE: fumer un joint ! - Sephi-Chan - 03-09-2007

L'utilisation des jointures n'introduit pas de ralentissement. Dans la plupart des cas, quand on utilise une jointure, on évite un lourd travail à PHP.
Si le gain ne se trouve pas dans la requête, il sera dans le traitement.


Sephi-Chan


RE: fumer un joint ! - Loetheri - 03-09-2007

Euh ... Il y a jointure et jointure ;-)
La première se fait à l'aide d'un LEFT JOIN x ON ( y = z) et l'autre se fait avec un simple WHERE.

Les deux s'utilisent, même si on conseille souvent d'utiliser la première. La deuxième méthode doit parfois s'utiliser.

Cela dit, peux-tu changer ton nom de sujet ?


RE: fumer un joint ! - naholyr - 03-09-2007

À noter puisque tu t'attaques aux jointures, il faut que tu regardes attentivement la différence entre jointure «interne» (INNER JOIN, par défaut) et jointure «externe» (OUTER JOIN).
La première va exclure les lignes qui ne peuvent être jointes, la deuxième va les inclure en mettant des valeurs NULL aux champs de la deuxième table.

C'est plus clair avec un exemple, on va reprendre celui de la traduction que j'ai donné récemment :
objets (id, nom, valeur)
Code :
1  couteau     10
2  fourchette  8
objets_i18n (id, langue, nom)
Code :
1  en  knife

Si je fais une jointure interne, je perds ma fourchette :
Code :
SELECT * FROM objets LEFT JOIN objets_i18n ON (objets.id = objets_i18n.id AND objets_i18n.langue = 'en') WHERE id IN (1,2)
(objets.id, objets.nom, objets.valeur, objets_i18n.id, objets_i18n.langue, objets_i18n.nom)
Code :
1  couteau  10  1  en  knife

Si je fais une jointure externe, je retrouve ma fourchette non traduite :
Code :
SELECT * FROM objets LEFT OUTER JOIN objets_i18n ON (objets.id = objets_i18n.id AND objets_i18n.langue = 'en') WHERE id IN (1,2)
(objets.id, objets.nom, objets.valeur, objets_i18n.id, objets_i18n.langue, objets_i18n.nom)
Code :
1  couteau     10  1     en    knife
2  fourchette  8   NULL  NULL  NULL

C'était juste au passage, parce que j'ai découvert ça il n'y a pas si longtemps au regard de mon temps d'utilisation de MySQL, et ça c'est comme certaines fonctions de PHP (glob(), call_user_func_array(), etc…Wink : bien trop peu connu Wink


RE: fumer un joint ! - Haiken - 03-09-2007

Attention à bien mettre des INDEX sur toutes les colonnes utilisées par la jointure (sous peine de performances déplorables)


RE: fumer un joint ! - Sephi-Chan - 03-09-2007

Pas forcément des index. C'est surtout des Clé primaires (ou étrangère dans la mesure du possible) qu'il faut.


Sephi-Chan


RE: fumer un joint ! - Haiken - 03-09-2007

Une clé primaire EST un index
Les clés étrangères, encore faut-il les avoir, donc utiliser innodb (je parle pas des moteurs encore exotiques), ce qui (à ma connaissance) est plutôt rare sur les jeux php, et là encore, pour pouvoir créer une clé étrangère il faut d'abord créer un index sur la colonne en question.
Donc, quand tu n'as pas de clés étrangères, tu met un index picétou :p