Tiene razón, aplicará ORDER BY después de reducir el número de filas con WHERE, GROUP BY y HAVING. Pero aplicará ORDER BY antes de LIMIT.
Entonces, si filtra el número de filas lo suficiente, entonces sí, ORDER BY RAND() puede lograr lo que desea sin un gran impacto en el rendimiento. Hay un beneficio legítimo en el código que es simple y fácil de leer.
El problema viene cuando piensas su consulta debería reducir las filas a algo pequeño, pero con el tiempo, a medida que crecen sus datos, la cantidad de filas que necesita ordenar vuelve a ser grande. Dado que su consulta hace LIMIT 10 en el resultado ordenado, oculta el hecho de que está realizando ORDER BY RAND () en 500k filas. Solo ve que el rendimiento empeora misteriosamente.
He escrito sobre métodos alternativos para seleccionar una fila aleatoria en mi libro SQL Antipatterns:Avoiding the Peligros de la programación de bases de datos , o en otras respuestas aquí en Stack Overflow:
- Seleccionar filas aleatorias con MySQL
- aleatorizar un gran conjunto de datos
- selección rápida de una fila aleatoria de una tabla grande en mysql