Se você deseja aproveitar LIMIT
para melhorar o desempenho, precisa
- entender os dados que você está recuperando
- indexação adequada da sequência correta de colunas
- assumir a responsabilidade de refatorar a consulta
- usando
LIMIT
antesJOIN
Esses princípios podem percorrer um longo caminho se você puder orquestrá-los.
Aprendi esses conceitos assistindo a este vídeo do YouTube (ouça com atenção o sotaque francês)
Usei esses conceitos para responder a uma pergunta muito difícil do StackOverflow sobre como obter os 40 principais artigos de algumas tabelas: 12 de maio de 2011: Buscando uma única linha da tabela de junção .
Na minha resposta a essa pergunta (16 de maio de 2011) , escrevi a seguinte consulta e a testei completamente:
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;
Observe a linha na consulta com o LIMIT
FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
Esta subconsulta está enterrada a três níveis de profundidade. Isso me permitiu obter os últimos 40 artigos usando LIMIT
. Depois, executei os JOINs necessários depois.
LIÇÕES APRENDIDAS
- Fazer
LIMIT
subconsultas internas nem sempre pode ser a resposta devido à cardinalidade dos índices, ao conteúdo dos dados e ao tamanho do conjunto de resultados do LIMIT
. Se você tiver todos os seus "patos consecutivos" (tenha os quatro princípios em mente para sua consulta), poderá obter resultados surpreendentemente bons.
- Faça suas consultas o mais simplista possível ao
LIMIT
coletar apenas as chaves.
LIMIT
melhora a eficiência: Otimizando LIMIT Consultas