Si vous souhaitez profiter de LIMIT
pour améliorer les performances, vous avez besoin
- comprendre les données que vous récupérez
- indexation correcte de la bonne séquence de colonnes
- prendre la responsabilité de refactoriser la requête
- utiliser
LIMIT
avantJOIN
Ces principes peuvent aller très loin si vous pouvez les orchestrer.
J'ai appris ces concepts en regardant cette vidéo YouTube (écoutez attentivement à travers l'accent français)
J'ai utilisé ces concepts pour répondre à une question StackOverflow très difficile sur l'obtention des 40 meilleurs articles de certaines tables: 12 mai 2011: récupération d'une seule ligne à partir de la table de jointure .
Dans ma réponse à cette question (16 mai 2011) , j'ai écrit la requête suivante et l'ai soigneusement testée:
SELECT
AAA.author_id,
AAA.date_created,
IFNULL(BBB.title,'<NO_TITLE>') title,
IFNULL(CCC.filename,'<NO-IMAGE>') filename,
IFNULL(CCC.date_added,'<NO-IMAGE-DATE>') image_date
FROM
(
SELECT
AA.id,
AA.date_added,
BB.author_id,
BB.date_created
FROM
(
SELECT
A.id,IFNULL(MAX(B.date_added),'1900-01-01 00:00:00') date_added
FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
LEFT JOIN article_images B ON A.id = B.article_id
GROUP BY A.id
) AA
INNER JOIN articles BB USING (id)
) AAA
LEFT JOIN article_contents BBB ON AAA.id=BBB.article_id
LEFT JOIN article_images CCC
ON (AAA.id=CCC.article_id AND AAA.date_added=CCC.date_added)
ORDER BY AAA.date_created DESC;
Veuillez noter la ligne dans la requête avec le LIMIT
FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
Cette sous-requête est enfouie à trois niveaux de profondeur. Cela m'a permis d'utiliser les 40 derniers articles LIMIT
. Ensuite, j'ai effectué les JOIN nécessaires par la suite.
LEÇONS APPRISES
- Faire des
LIMIT
sous-requêtes internes peut ne pas toujours être la réponse en raison de la cardinalité des index, du contenu des données et de la taille du jeu de résultats à partir du LIMIT
. Si vous avez tous vos «canards d'affilée» (ayez les quatre principes à l'esprit pour votre requête), vous pouvez obtenir des résultats étonnamment bons.
- Faites vos requêtes aussi simplistes que possible lorsque vous le faites
LIMIT
en rassemblant uniquement les clés.
LIMIT
améliorent l'efficacité: Optimisation des requêtes LIMIT