Pergunta

Existe uma diferença de desempenho apreciável entre ter uma consulta SELECT foo, bar, FROM users que retorna 500 linhas e 500 consultas SELECT foo, bar, FROM users WHERE id = x vindo de uma só vez?

Em uma aplicação PHP que estou escrevendo, estou tentando escolher entre uma seção legível escrita clara e de código que iria produzir cerca de 500 instruções SELECT; ou escrever uma lo de uma forma obscura, complexa que usaria apenas uma SELECT que retorna 500 linhas.

Eu preferiria o caminho que usos clara, código de fácil manutenção, mas estou preocupado que a sobrecarga da conexão para cada um dos SELECTs vai causar problemas de desempenho.

info fundo, no caso, é relevante: 1) Este é um módulo Drupal, codificada em PHP 2) As tabelas em questão obter muito poucas inserções e atualizações, e raramente são bloqueados 3) SQL JOINs não são possíveis por razões que não são relevantes para a questão

Obrigado!

Foi útil?

Solução

É quase sempre mais rápido para fazer um grande lote SELECT e analisar os resultados em seu código do aplicativo do que fazer uma enorme quantidade de SELECTs para uma linha. Eu recomendaria que você implementar ambos e perfil deles, no entanto. Sempre nos esforçamos para minimizar o número de suposições que você tem que fazer.

Outras dicas

Eu não me preocuparia com a sobrecarga da conexão de consultas mysql muito, especialmente se você não está fechando a conexão entre cada consulta. Considere-se que se a consulta cria uma tabela temporária, você já passou mais tempo na consulta do que a sobrecarga da consulta levou.

Eu amo fazer uma consulta SQL complexa, pessoalmente, mas eu descobri que o tamanho das tabelas, mysql query cache e consulta de desempenho de consultas que precisa fazer verificação de intervalo (mesmo contra um índice) fazer a diferença.

Eu sugiro o seguinte:

1) Estabelecer o simples, linha de base correto. Eu suspeito que esta é a abordagem zilhão-consulta. Isso não é errado, e muito provavelmente helfully correta. Executá-lo algumas vezes e ver o seu cache de consulta e desempenho da aplicação. A capacidade de manter a sua sustentável aplicativo é muito importante, especialmente se você trabalha com outros mantenedores de código. Além disso, se você está consultando realmente grandes tabelas, consultas pequenas manterá escalabilidade.

2) Code a consulta complexa. Comparar os resultados de precisão, e depois a hora. Em seguida, use ESPERAR na consulta para ver o que as linhas digitalizadas são. Eu tenho encontrado frequentemente que se eu tiver um JOIN ou um WHERE x! = Y, ou uma condição que cria uma tabela temporária, o desempenho da consulta pode ficar muito ruim, especialmente se eu estou em uma tabela que está sempre sendo atualizado. No entanto, eu também descobri que uma consulta complexa pode não ser correto, e também que uma consulta complexa pode mais facilmente quebrar como uma aplicação cresce. consultas complexas normalmente varredura de conjuntos maiores de linhas, muitas vezes criando tabelas temporárias e invocar scans using where. Quanto maior a tabela, o mais caro estes get. Além disso, você pode ter considerações equipe onde as consultas complexas não se adequar pontos fortes da sua equipe.

3) Partilhe os resultados com sua equipe.

As consultas complexas são menos propensos a bater o cache de consultas mysql, e se eles são grandes o suficiente, não cache-los. (Você deseja salvar o cache de consultas mysql para consultas frequentemente atingidos.) Além disso, consulta onde predicados que têm de percorrer o índice não vai fazer tão bem. (X! = Y, x> y, x SELECT foo, bar FROM users WHERE foo != 'g' and mumble < '360' acabar fazendo varreduras. (O custo de sobrecarga de consulta pode ser insignificante, nesse caso.)

Pequenos consultas muitas vezes pode completar sem criar tabelas temporárias apenas por obter todos os valores do índice, desde que os campos que você está selecionando e predicar em são indexados. Assim, o desempenho da consulta de SELECT foo, bar FROM users WHERE id = x é realmente grande (esp se colunas foo e bar são indexados como, aka alter table users add index ix_a ( foo, bar );.)

Outras formas boas para aumentar o desempenho em sua aplicação seria armazenar em cache esses pequenos resultados da consulta na aplicação (se for o caso), ou fazendo trabalhos em lote de uma consulta visão materializada. Além disso, considere o memcached ou algumas características encontradas em XCache.

Parece que você sabe o que os valores id 500 são, então porque não fazer algo como isto:

// Assuming you have already validated that this array contains only integers
// so there is not risk of SQl injection

$ids = join(',' $arrayOfIds);

$sql = "SELECT `foo`, `bar` FROM `users` WHERE `id` IN ($ids)";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top