Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[MySQL] Optimisation des requetes

2 réponses
Avatar
Dominique Ottello
Bonjour,

Pour en finir avec :
- 122 fichiers de données répartis dans plus de 40 répertoires
- des programmes de gestion PHP pleins de verrues
je me suis enfin décidé, il y a deux semaines, à passer tout ça en base
de données.
Compte tenu des hébergeurs, il s'agit de MySQL 5 avec moteur MyISAM
(J'aurais préféré InnoDB, mais c'est pas supporté...)

Débutant en gestion de BDD, et en fonction de mes différentes
documentations papier et tutoriaux sur des sites comme php.net ou
siteduzero.com, j'ai essayé de limiter le nombre de requêtes.

Néanmoins, je suis, peut-être, fâché avec les jointures que je n'utilise
pas toujours lorsque plusieurs tables sont en jeu.

Seulement trois tables sont nécessaires (1) :
- vilg_apprentis
- vilg_promotions
- vilg_spec

Par exemple, pour afficher la légende des affichages des apprentis par
promotion, comme ici
http://aviatechno.free.fr/vilgenis/55-58/promo_55-58.php lorsque au
moins un apprenti a une spécialité, j'utilise la requête :

SELECT DISTINCT(CONCAT(S.s_abr,'=',S.s_def)) AS Legende
FROM vilg_apprentis AS A,vilg_spec AS S
WHERE A.a_promo = '$promotion'
AND A.a_spec = S.s_abr;

Bien que deux tables soient utilisées, je n'utilise pas INNER JOIN
Ai-je raison ?

Même démarche pour cette requête :
SELECT COUNT(S.s_stag) AS Nb_Stagiaires
FROM vilg_apprentis AS A,vilg_spec AS S
WHERE A.a_promo = '$promotion'
AND A.a_spec = S.s_abr
AND S.s_stag = 1;

En revanche, pour la liste totale des apprentis comme ici :
http://aviatechno.free.fr/vilgenis/toutes/toutes_promos.php
j'utilise la jointure INNER JOIN

SELECT CONCAT(UPPER(A.a_nom), ' ',A.a_prenom), P.p_rep, P.p_site
FROM vilg_apprentis AS A
INNER JOIN vilg_promotions AS P
ON A.a_promo = P.p_nom
ORDER BY A.a_nom, A.a_prenom;

Même question : Ai-je raison ?

Merci

(1) Entre nous, ça m'a énormément simplifié la vie par rapport aux 122
fichiers de données.
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis

2 réponses

Avatar
Jogo
Sur fr.comp.applications.sgbd, Dominique Ottello disait :

SELECT DISTINCT(CONCAT(S.s_abr,'=',S.s_def)) AS Legende
FROM vilg_apprentis AS A,vilg_spec AS S
WHERE A.a_promo = '$promotion'
AND A.a_spec = S.s_abr;

Bien que deux tables soient utilisées, je n'utilise pas INNER JOIN
Ai-je raison ?



Non.

Au niveau de la performance, il est fort probable que cela ne
change rien (d'autres que moi sauront te répondre). Mais pour la
lisibilité, il est préférable de séparer la jointure des conditions.

Dans la requête que j'ai citée, ce qui suit le AND n'est pas
réellement une condition. Il serait donc préférable que cette jointure
(c'en est une) figure dans la partie FROM plutôt que dans la partie
WHERE.

--
Je suis branché via cable, je ne peut donc pas accéder au minitel;
quelqu'un pourrait-il déposer pour moi un message sur une BAL
minitel???
-+- om in GNU - Et par téléphone, ça marche pas non plus ? -+-
Avatar
Dominique Ottello
Jogo écrivait :

Dans la requête que j'ai citée, ce qui suit le AND n'est pas
réellement une condition. Il serait donc préférable que cette jointure
(c'en est une) figure dans la partie FROM plutôt que dans la partie
WHERE.



Merci.

Je suis maintenant convaincu qu'il faut 'utiliser des « vraies »
jointures ; c'est nettement plus « lisible »

SELECT DISTINCT(CONCAT(S.s_abr,'=',S.s_def)) AS Legende
FROM vilg_spec AS S
INNER JOIN vilg_apprentis AS A ON A.a_spec = S.s_abr
WHERE A.a_promo = '$promotion'
--
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant
Technologie aéronautique - http://ottello.net - Les anciens de Vilgénis