Adicionar 'LIMIT 1' às consultas do MySQL as torna mais rápidas quando você sabe que haverá apenas 1 resultado?

86

Quando adiciono LIMIT 1 a uma consulta MySQL, ele interrompe a pesquisa depois de encontrar 1 resultado (tornando-o mais rápido) ou ainda busca todos os resultados e trunca no final?

Logan Serman
fonte
1
Não se houver uma UNIQUE(ou PRIMARY KEY) restrição (ou índice) na coluna do filtro. stackoverflow.com/questions/8467092/…
ma11hew28

Respostas:

81

Dependendo da consulta, adicionar uma cláusula de limite pode ter um grande efeito no desempenho. Se você deseja apenas uma linha (ou sabe com certeza que apenas uma linha pode satisfazer a consulta) e não tem certeza sobre como o otimizador interno irá executá-la (por exemplo, a cláusula WHERE não atinge um índice e assim por diante), então você definitivamente deve adicionar uma cláusula LIMIT.

Quanto às consultas otimizadas (usando índices em tabelas pequenas), provavelmente não importará muito no desempenho, mas, novamente - se você está interessado apenas em uma linha, adicione uma cláusula LIMIT independentemente.

Eran Galperin
fonte
30
Para fins de antibugging, você pode querer enviar LIMIT 2 e depois reclamar ou explodir se sua suposição de linha única não se sustentar.
Jeffrey Hantin
6
@JeffreyHantin Se realmente puder haver apenas um, você deve preferir adicionar uma restrição exclusiva ao banco de dados. Muito mais limpo do que bagunçar seu código com verificações de integridade.
Cristian Vrabie
@CristianVrabie Se isso pode ser expresso como uma restrição única, claro, mas isso é uma afirmação sobre os dados nas tabelas. Enviar LIMIT 2 e verificar 1 é uma afirmação sobre a consulta em si, que pode muito bem conter um bug, como uma condição de junção especificada inadequadamente.
Jeffrey Hantin
1
@JeffreyHantin Bastante justo, mas exceto se você codificar para o Mars Rover, você escreve testes para ele em vez de poluir seu código.
Cristian Vrabie
8
@JeffreyHantin Se a suposição de que há apenas um estiver correta, adicionar LIMIT 2 não eliminaria qualquer otimização, uma vez que pesquisaria todas as linhas? Adicionar LIMIT 2 nesse caso não é melhor (em termos de otimização) do que não adicionar nada.
Chris Middleton
19

O limite pode afetar o desempenho da consulta (consulte os comentários e o link a seguir) e também reduz o conjunto de resultados que é gerado pelo MySQL. Para uma consulta em que você espera um único resultado, há benefícios.

Além disso, limitar o conjunto de resultados pode, de fato, acelerar o tempo total de consulta, pois a transferência de grandes conjuntos de resultados usa memória e, potencialmente, cria tabelas temporárias no disco. Mencionei isso porque recentemente vi um aplicativo que não usava limit kill em um servidor devido aos enormes conjuntos de resultados e, com o limite estabelecido, a utilização de recursos caiu tremendamente.

Verifique esta página para obter mais detalhes: Documentação MySQL: Otimização LIMIT

rjamestaylor
fonte
A página que você vinculou diz: "Se você estiver selecionando apenas algumas linhas com LIMIT, o MySQL usa índices em alguns casos, quando normalmente prefere fazer uma varredura completa da tabela." Isso não parece que a consulta em si seja sempre processada normalmente.
che
bom ponto. Eu estava fazendo uma generalização com base nas observações do uso de EXPLAIN. Obrigado pela pegadinha.
rjamestaylor
O link é muito apreciado. FWIW, a maior parte desta resposta parece se aplicar a situações em que, sem Limite, pode haver um grande conjunto de resultados . A questão está perguntando se importa quando apenas 1 linha será correspondida com êxito; nesse caso, o "conjunto de resultados" é apenas 1 linha (mesmo sem Limite).
Toolmaker Steve
5

Se houver apenas 1 resultado retornando, então não, LIMIT não o tornará mais rápido. Se houver muitos resultados e você só precisar do primeiro resultado, e não houver instruções GROUP ou ORDER by, LIMIT tornará isso mais rápido.

Kris Erickson
fonte
2
Deve ser mais rápido mesmo com 1 linha, se não houver chaves únicas / primárias, porque ele para de pesquisar depois de encontrar a primeira ocorrência
the_nuts
Kris, sua primeira frase pode ser lida de duas maneiras. Se você quer dizer "apenas 1 linha poderia ser retornada" (por exemplo, consultar uma coluna única), então o que você diz é verdade. OTOH, se você quiser dizer "sempre que apenas 1 resultado correspondente for encontrado", o limite não o tornará mais rápido: tem certeza? Isso às vezes não evita ter que puxar páginas adicionais?
Toolmaker Steve
5

A resposta, em resumo, é sim. Se você limitar seu resultado a 1, mesmo que esteja "esperando" um resultado, a consulta será mais rápida porque seu banco de dados não examinará todos os seus registros. Ele simplesmente parará quando encontrar um registro que corresponda à sua consulta.

Max Alexander Hanna
fonte
1
Essa resposta é enganosa, porque não tem a advertência vista em comentários sobre outras respostas (7 anos antes!) De que se o banco de dados sabe que apenas um registro pode corresponder (por exemplo, consultar uma coluna única), o Limite 1 não terá efeito.
Toolmaker Steve
Seriamente? O otimizador de consulta pode tirar vantagem do fato de que certas condições garantem que apenas 1 registro possa ser retornado. Eu estava apontando que sua resposta não é correta em todas as circunstâncias. (E, portanto, subtrai valor do que já foi dito anos antes.) Se você concordar, pode reconhecer a correção do meu comentário. Se você não concorda, pode esclarecer o porquê.
Toolmaker Steve
1

Se você realmente espera apenas um único resultado, realmente faz sentido acrescentar LIMIT à sua consulta. Não conheço o funcionamento interno do MySQL, mas tenho certeza de que ele não coletará um conjunto de resultados de mais de 100.000 registros apenas para truncá-lo de volta para 1 no final.

driAn
fonte