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:
- Selecionar linhas aleatórias com o MySQL
- randomizing grande conjunto de dados
- seleção rápida de uma linha aleatória de uma tabela grande no mysql