Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Quando a função ORDER BY RAND() do MySQL é ordenada?


Você está certo, ele aplicará o ORDER BY após reduzir o número de linhas com WHERE, GROUP BY e HAVING. Mas será aplicado ORDER BY antes de LIMIT.

Portanto, se você filtrar o número de linhas o suficiente, sim, o ORDER BY RAND() pode alcançar o que você deseja sem um grande impacto no desempenho. Há um benefício legítimo no código que é simples e de fácil leitura.

O problema vem quando você pensa sua consulta deve reduzir as linhas para algo pequeno, mas com o tempo, à medida que seus dados crescem, o número de linhas que ele precisa classificar se torna grande novamente. Como sua consulta faz LIMIT 10 no resultado classificado, oculta o fato de que você está executando ORDER BY RAND() em 500k linhas. Você apenas vê o desempenho piorando misteriosamente.

Eu escrevi sobre métodos alternativos para escolher uma linha aleatória em meu livro SQL Antipatterns:Avoiding the Armadilhas da programação de banco de dados , ou em outras respostas aqui no Stack Overflow: