Vous avez raison, il appliquera ORDER BY après avoir réduit le nombre de lignes avec WHERE, GROUP BY et HAVING. Mais il appliquera ORDER BY avant LIMIT.
Donc, si vous filtrez suffisamment le nombre de lignes, alors oui, ORDER BY RAND() peut atteindre ce que vous voulez sans un grand impact sur les performances. Il existe un avantage légitime à un code simple et facilement lisible.
Le problème vient quand vous pensez votre requête devrait réduire les lignes à quelque chose de petit, mais au fil du temps, à mesure que vos données augmentent, le nombre de lignes à trier redevient important. Étant donné que votre requête effectue alors LIMIT 10 sur le résultat trié, le fait que vous exécutez ORDER BY RAND() sur 500 000 lignes est masqué. Vous constatez simplement que les performances se détériorent mystérieusement.
J'ai écrit sur des méthodes alternatives pour choisir une ligne aléatoire dans mon livre Antipatterns SQL :éviter les Les pièges de la programmation de base de données , ou dans d'autres réponses ici sur Stack Overflow :
- Sélectionner des lignes aléatoires avec MySQL
- randomiser un grand ensemble de données
- sélection rapide d'une ligne aléatoire dans une grande table dans mysql