Oui tout à fait, merci pour ce rappel
Bonsoir,
J'ai lu un peu vite la discussion mais j'ai l'impression que ce qui plombe les performances, c'est le ORDER BY, non ?
Avez-vous essayé votre jointure externe sans le ORDER BY mais en laissant le LIMIT 20, pour voir ?
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Bonjour,
Désolé pour cette réponse tardive.
Oui c'est bien le ORDER BY qui ralentit le tout
Réfléchissons donc pourquoi le order by ralentit tout...
Du fait de la jointure externe, la colonne name va se retrouver avec des NULL quand il n'y a pas de traductions.
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 select herbs.id, sciname, name from herbs left join herb_translations on herbs.id = herb_translations.herb_id and locale = 'fr' order by herb_translations.name asc limit 20;
Et vous demandez d'ordonner la colonne name.
Or pour un SGBD, NULL <> NULL et je me demande si MySQL n'est pas embêté par le tri de ces NULL.
Du coup, je propose l'idée suivante :
=> Une chaîne vide à la place de NULL, MySQL devrait savoir l'ordonner sans problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 SELECT herbs.id, sciname, name FROM herbs INNER JOIN herb_translations on herbs.id = herb_translations.herb_id AND locale = 'fr' UNION SELECT herbs.id, sciname, '' FROM herbs LEFT JOIN herb_translations on herbs.id = herb_translations.herb_id AND locale = 'fr' WHERE herb_translations.herb_id IS NULL ORDER BY name ASC LIMIT 20;
Et à la place de la chaîne vide, vous pouvez aussi mettre une chaîne indiquant qu'il n'y a pas de traduction : 'SANS TRADUCTION' par exemple. Vous verrez ainsi facilement en plus quelles traductions il vous manque.
À tester !
Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
Voici le résulats des Analyze sous MariaDB 10.6, peu convaincant malheureusement
1 : inner join
2 : outer join
3 : inner union outer avec restriction
Le DB<>Fiddle ICI
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager