MIN / MAX vs ORDER BY e LIMIT

Das seguintes consultas, qual método você consideraria melhor? Quais são os seus motivos (eficiência de código, melhor manutenção, menos WTFery) …

SELECT MIN(`field`) FROM `tbl`; SELECT `field` FROM `tbl` ORDER BY `field` LIMIT 1; 

Na pior das hipóteses, quando você está olhando para um campo não indexado, usar MIN() requer uma única passagem completa da tabela. Usando SORT e LIMIT requer um filesort. Se correr contra uma mesa grande, provavelmente haveria uma diferença significativa no desempenho percebido. Como um ponto de dados sem sentido, MIN() tomou .36s enquanto SORT e LIMIT tomaram .84s contra uma tabela de 106.000 linhas no meu servidor de desenvolvimento.

Se, no entanto, você está olhando para uma coluna indexada, a diferença é mais difícil de perceber (o ponto de dados sem sentido é 0,00 em ambos os casos). Olhando para a saída de explain, no entanto, parece que MIN() é capaz de simplesmente extrair o menor valor do índice (as linhas ‘Select tables optimized away’ e ‘NULL’) enquanto o SORT e LIMIT ainda precisam fazer um passagem ordenada do índice (106.000 linhas). O impacto real no desempenho é provavelmente insignificante.

Parece que MIN() é o caminho a percorrer – é mais rápido no pior dos casos, indistinguível no melhor dos casos, é o SQL padrão e expressa mais claramente o valor que você está tentando obter. O único caso em que parece que usar SORT e LIMIT seria desejável seria, como mson mencionou, onde você está escrevendo uma operação geral que encontra os valores N superiores ou inferiores de colunas arbitrárias e não vale a pena escrever o caso especial Operação.

 SELECT MIN(`field`) FROM `tbl`; 

Simplesmente porque é compatível com ANSI. Limite 1 é particular para MySql como TOP é para o SQL Server.

Como Mson e Sean McSomething apontaram, MIN é preferível.

Uma outra razão em que ORDER BY + LIMIT é útil é se você deseja obter o valor de uma coluna diferente da coluna MIN.

Exemplo:

 SELECT some_other_field, field FROM tbl ORDER BY field LIMIT 1 

Eu acho que as respostas dependem do que você está fazendo.

Se você tiver uma consulta de 1 off e a intenção for tão simples quanto você especificou, selecione min (campo) é preferível.

No entanto, é comum que esses tipos de requisitos sejam alterados – obtenha os primeiros resultados, obtenha os resultados n-m, etc.

Eu não acho que é uma idéia muito terrível para se comprometer com o database escolhido. Alterar dbs não deve ser feito de ânimo leve e tem que rever o preço que você paga quando você faz esse movimento.

Por que se limitar agora, pela dor que você pode ou não sentir mais tarde?

Eu acho que é bom ficar ANSI, tanto quanto possível, mas isso é apenas uma diretriz …

Dado um desempenho aceitável, eu usaria o primeiro porque ele é semanticamente mais próximo da intenção.
Se o desempenho foi um problema, (a maioria dos otimizadores modernos provavelmente irá otimizar ambos para o mesmo plano de consulta, embora você tenha que testar para verificar isso), então é claro que eu usaria o mais rápido.