Masz rację, zastosuje ORDER BY po zmniejszeniu liczby wierszy za pomocą WHERE, GROUP BY i HAVING. Ale zastosuje ORDER BY przed LIMIT.
Więc jeśli wystarczająco odfiltrujesz liczbę wierszy, to tak, ORDER BY RAND() może osiągnąć to, czego chcesz, bez dużego wpływu na wydajność. Prosty i łatwy do odczytania kod ma uzasadnioną korzyść.
Kłopot pojawia się, gdy myślisz Twoje zapytanie powinno zredukować wiersze do czegoś małego, ale z biegiem czasu, gdy dane rosną, liczba wierszy, które trzeba posortować, znów staje się duża. Ponieważ twoje zapytanie wykonuje wtedy LIMIT 10 na posortowanym wyniku, ukrywa fakt, że wykonujesz ORDER BY RAND() na 500k wierszach. Po prostu widzisz, jak wydajność w tajemniczy sposób się pogarsza.
O alternatywnych metodach wybierania losowego wiersza napisałem w mojej książce Antywzorce SQL:unikanie Pułapki programowania baz danych lub w innych odpowiedziach tutaj na Stack Overflow:
- Wybieranie losowych wierszy za pomocą MySQL
- randomizowanie dużego zbioru danych
- szybki wybór losowego wiersza z dużej tabeli w mysql