Du har ret, det vil anvende ORDER BY efter at have reduceret antallet af rækker med WHERE, GROUP BY og HAVING. Men det vil gælde ORDER BY inden LIMIT.
Så hvis du filtrerer antallet af rækker tilstrækkeligt ned, ja, ORDER BY RAND() kan muligvis opnå det, du ønsker, uden en stor præstationspåvirkning. Der er en legitim fordel ved kode, der er enkel og let læselig.
Problemerne kommer, når du tænker din forespørgsel burde reducere rækkerne til noget lille, men over tid, efterhånden som dine data vokser, bliver antallet af rækker, det skal sortere, stort igen. Da din forespørgsel så gør LIMIT 10 på det sorterede resultat skjuler det faktum, at du udfører ORDER BY RAND() på 500k rækker. Du ser bare, at ydeevnen på mystisk vis bliver dårligere.
Jeg har skrevet om alternative metoder til at vælge en tilfældig række i min bog SQL Antipatterns:Avoiding the Faldgruber ved databaseprogrammering , eller i andre svar her på Stack Overflow:
- Valg af tilfældige rækker med MySQL
- randomisering af stort datasæt
- hurtigt valg af en tilfældig række fra en stor tabel i mysql