MySQL 3.23/4.0/4.1 e 5.1 afirma:
Se você usar
GROUP BY
[ forselect
] , as linhas de saída serão classificadas de acordo com asGROUP BY
colunas, como se você tivesse umORDER BY
para as mesmas colunas. ➫➫➫
No entanto, o MySQL 5.5 afirma:
Confiar na classificação implícita
GROUP BY
no MySQL 5.5 está obsoleto . Para obter uma ordem de classificação específica de resultados agrupados, é preferível usar umaORDER BY
cláusula explícita. ➫➫➫
(A informação acima também é declarada em 5.6 e 5.7 .)
O que exatamente significa "obsoleto" no MySQL?
O comportamento implícito group by
ainda é garantido para funcionar no MySQL 5.5, 5.6 e 5.7 (a versão atual mais recente), assim como em todas as versões anteriores?
ORDER BY NULL
Ainda é necessário impedir que o MySQL faça uma classificação desnecessária?
Editar (por Rick James)
Isso cobre problemas de banco de dados:
- A ordenação de um
GROUP BY
semORDER BY
- O significado e a utilidade de
ORDER BY NULL
- A sabedoria de usar um 'recurso' 'obsoleto'
- O significado de "obsoleto" no manual do MySQL (não apenas para este caso)
"Descontinuado" significa "não use; será removido/proibido/errôneo/quebrado/etc é uma versão futura". Enquanto isso, funciona .
Esta é uma maneira lenta e tediosa para o MySQL mudar algo que irá quebrar muitos programas. Ninguém sabe quantas pessoas dependem de
GROUP BY
um arquivoORDER BY
. Esse "recurso" específico era uma extensão do padrão Ansi. Eu suspeito que eles gostariam de mudar o MySQL por dois motivos:A maneira simples (pense na versão 3.xx) de fazer
GROUP BY
é classificar as linhas e percorrê-las, reunindo dups e fazendoSUM()
etc. E, na época das máquinas de núcleo único, isso era bastante razoável. E o resultado seria classificado naturalmente. Mas... Se você quiser lançar umGROUP BY
em uma máquina de 24 núcleos, fica muito complicado manter a classificação. Então (estou supondo), essa é uma otimização que chegará ao mesmo tempo queGROUP BY
não faz mais um arquivoORDER BY
. Isso pode acontecer em 5.8 (apenas um palpite).Você ainda pode obter o efeito, mas precisa dizer explicitamente
ORDER BY
com a mesma lista de colunas/expressões.O
ORDER BY NULL
(atualmente) não faz nada na maioria dos casos, já que a maioria dos casos considera mais eficiente classificar os arquivosGROUP BY
.ORDER BY NULL
, no futuro provavelmente será permitido, mas efetivamente será um no-op; afinal, levará ao mesmo resultado.Outras coisas obsoletas têm lógica semelhante.
CREATE TABLE (...) TYPE=MyISAM
eventualmente (após um período de depreciação) tornou-seCREATE TABLE (...) ENGINE=MyISAM
. Isso quebrou algumas situações de exportação/importação, mas apenas se você estivesse passando de uma versão realmente antiga para uma nova.SHOW INNODB STATUS
tornou -seSHOW ENGINE INNODB STATUS
, provavelmente para fazer uma análise mais limpa deSHOW
.Desde o MySQL 5.5,
GROUP BY
fazer o pedido não é mais garantido implicitamente.Observe como o MySQL lida
NULL
com valores comORDER BY
A mesma coisa se aplica a DISTINCT
Como
ORDER BY NULL
é crescente e o valor de order é NULL, a ordem do conjunto de dados antesORDER BY NULL
será a mesma depois.Outro problema externo que pode impor ou negar a ordenação é o InnoDB Storage Engine. Eu tenho um post antigo sobre como o índice clusterizado às vezes pode atrapalhar a tabela em uma ordem de índice físico desejada: MySQL InnoDB Sorting Issue . Aqui está uma postagem ainda melhor (Qual é a ordem padrão dos registros para uma instrução SELECT no MySQL?) de Laurynas Biveinis sobre como o mecanismo de armazenamento afeta a ordem.
Os desenvolvedores contam com a ordem implícita há anos. O tapete pode ser facilmente puxado sob você caso você decida atualizar o MySQL a cada versão menor.
Para ilustrar isso, veja a opção simplificada_binlog_gtid_recovery . Foi introduzido no MySQL 5.6.21 para ajudar o mysqld a atravessar binlogs para GTID e recuperação de falhas. Adivinha ??? Duas versões menores depois (MySQL 5.6.23), a Oracle introduziu o binlog_gtid_simple_recovery . Você não sabe quando a Oracle retirará o tapete e retirará o uso de simplificado_binlog_gtid_recovery . Muitas infraestruturas contando com essa velha opção. Portanto, COMPRADOR CUIDADO!!!
Claro, esta é uma nova opção que foi rapidamente substituída por um novo nome.
Agora, imagine quantos aplicativos foram escritos que dependem da classificação implícita e são afetados por uma atualização do mysql.
Portanto, você sempre deve testar o código no servidor Dev/Staging para quaisquer alterações comportamentais em SELECTs. Não há substituto para tais testes.
Isso significa que as versões mais antigas do MySQL costumavam ter uma classificação padrão implicitamente na mesma coluna como "agrupar por" e é esse comportamento que está obsoleto. Tudo o que você especificar na cláusula group by se comportará da mesma forma que anteriormente e com certeza funcionará, apenas a ordem pode ser diferente.
A última parte da sua pergunta (ORDER BY NULL) não é mais necessária, pois a classificação padrão desnecessária agora ocorre mais (já que foi obsoleta)