Hai ragione, applicherà ORDER BY dopo aver ridotto il numero di righe con WHERE, GROUP BY e HAVING. Ma si applicherà ORDER BY prima di LIMIT.
Quindi, se si filtra sufficientemente il numero di righe verso il basso, allora sì, ORDER BY RAND() può ottenere ciò che si desidera senza un grande impatto sulle prestazioni. C'è un vantaggio legittimo nel codice che è semplice e facilmente leggibile.
I guai vengono quando pensi la tua query dovrebbe ridurre le righe a qualcosa di piccolo, ma nel tempo man mano che i tuoi dati crescono, il numero di righe necessarie per ordinare diventa di nuovo grande. Poiché la tua query esegue LIMIT 10 sul risultato ordinato nasconde il fatto che stai eseguendo ORDER BY RAND() su 500k righe. Vedete solo che le prestazioni peggiorano misteriosamente.
Ho scritto di metodi alternativi per selezionare una riga casuale nel mio libro SQL Antipatterns:evitare il Insidie della programmazione di database o in altre risposte qui su Stack Overflow:
- Selezione di righe casuali con MySQL
- randomizzazione di grandi set di dati
- selezione rapida di una riga casuale da una grande tabella in mysql