Прав сте, той ще приложи ORDER BY след намаляване на броя на редовете с WHERE, GROUP BY и HAVING. Но ще се приложи ORDER BY преди LIMIT.
Така че, ако филтрирате достатъчно броя на редовете надолу, тогава да, ORDER BY RAND() може да постигне това, което искате, без голямо въздействие върху производителността. Има законна полза от кода, който е прост и лесно четим.
Проблемът идва, когато мислите вашата заявка трябва да намали редовете до нещо малко, но с течение на времето, когато данните ви нарастват, броят на редовете, които трябва да сортира, отново става голям. Тъй като вашата заявка прави LIMIT 10 за сортирания резултат, скрива факта, че изпълнявате ORDER BY RAND() на 500k реда. Просто виждате, че изпълнението мистериозно се влошава.
Писах за алтернативни методи за избиране на произволен ред в книгата си SQL Antipatterns:Избягване на Подводни камъни при програмирането на бази данни , или в други отговори тук в Stack Overflow:
- Избиране на произволни редове с MySQL
- рандомизиране на голям набор от данни
- бърз избор на произволен ред от голяма таблица в mysql