O que abordaria sua pergunta é o assunto JOIN DECOMPOSITION.
De acordo com a página 209 do livro
Você pode decompor uma associação executando várias consultas de tabela única em vez de uma associação multititulada e executando a associação no aplicativo. Por exemplo, em vez desta consulta única:
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id
WHERE tag.tag = 'mysql';
Você pode executar estas consultas:
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id=1234;
SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
Por que diabos você faria isso? Parece um desperdício à primeira vista, porque você aumentou o número de consultas sem receber nada em troca. No entanto, essa reestruturação pode realmente oferecer vantagens significativas de desempenho:
- O armazenamento em cache pode ser mais eficiente. Muitos aplicativos armazenam em cache "objetos" que são mapeados diretamente para as tabelas. Neste exemplo, se o objeto com a tag
mysql
já estiver armazenado em cache, o aplicativo ignorará a primeira consulta. Se você encontrar postagens com um ID 123, 567 ou 908 no cache, poderá removê-las da IN()
lista. O cache de consulta também pode se beneficiar dessa estratégia. Se apenas uma das tabelas mudar com frequência, a decomposição de uma junção poderá reduzir o número de invalidações de cache.
- Às vezes, executar as consultas individualmente pode reduzir a contenção de bloqueio
- A realização de junções no aplicativo facilita o dimensionamento do banco de dados, colocando tabelas em diferentes servidores.
- As consultas em si podem ser mais eficientes. Neste exemplo, o uso de uma
IN()
lista em vez de uma junção permite que o MySQL classifique os IDs das linhas e recupere as linhas da maneira mais otimizada possível com uma junção.
- Você pode reduzir acessos de linhas redundantes. Fazer uma junção no aplicativo significa recuperar cada linha apenas uma vez., Enquanto uma junção na consulta é essencialmente uma desnormalização que pode acessar repetidamente os mesmos dados. Pelo mesmo motivo, essa reestruturação também pode reduzir o tráfego total da rede e o uso de memória.
- Até certo ponto, você pode ver esta técnica como implementando manualmente uma junção de hash em vez do algoritmo de loops aninhados que o MySQL usa para executar uma junção. Uma junção de hash pode ser mais eficiente.
Como resultado, associações de ações no aplicativo podem ser mais eficientes quando você armazena em cache e reutiliza muitos dados de consultas anteriores, distribui dados em vários servidores, substitui associações por IN()
listas ou uma associação se refere à mesma tabela várias vezes.
OBSERVAÇÃO
Gosto do primeiro marcador porque o InnoDB é um pouco pesado quando verifica o cache da consulta.
Quanto ao último marcador, escrevi uma postagem em 11 de março de 2013 ( existe uma diferença de execução entre uma condição JOIN e uma condição WHERE? ) Que descreve o algoritmo de loop aninhado. Depois de ler, você verá o quão boa pode ser a decomposição da junção.
Quanto a todos os outros pontos do livro , os desenvolvedores realmente buscam o desempenho como resultado final. Alguns contam com meios externos (fora do aplicativo) para aprimoramentos de desempenho, como usar um disco rápido, obter mais CPUs / Núcleos, ajustar o mecanismo de armazenamento e ajustar o arquivo de configuração. Outros se prenderão e escreverão um código melhor. Alguns podem recorrer à codificação de toda a inteligência de negócios em Procedimentos armazenados, mas ainda não aplicar a decomposição de junção (consulte Quais são os argumentos contra ou para colocar a lógica do aplicativo na camada do banco de dados? Junto com as outras postagens). Tudo depende da cultura e tolerância de cada loja de desenvolvedores.
Alguns podem ficar satisfeitos com o desempenho e não tocar mais no código. Outros simplesmente não percebem que há grandes benefícios que se pode colher se tentarem ingressar na composição.
Para os desenvolvedores que estão dispostos ...
DE UMA CHANCE !!!