Máte pravdu, použije ORDER BY po snížení počtu řádků pomocí WHERE, GROUP BY a HAVING. Ale bude platit ORDER BY před LIMIT.
Takže pokud dostatečně odfiltrujete počet řádků, pak ano, ORDER BY RAND() může dosáhnout toho, co chcete, bez velkého dopadu na výkon. Kód, který je jednoduchý a snadno čitelný, má legitimní výhodu.
Problém nastává, když přemýšlíte váš dotaz by měl zredukovat řádky na něco malého, ale postupem času, jak vaše data rostou, počet řádků, které je třeba seřadit, se opět zvětší. Protože váš dotaz potom LIMIT 10 na seřazeném výsledku skryje skutečnost, že provádíte ORDER BY RAND() na 500 000 řádcích. Jen vidíte, jak se výkon záhadně zhoršuje.
O alternativních metodách výběru náhodného řádku jsem psal ve své knize SQL Antipatterns:Avoiding the Úskalí databázového programování , nebo v jiných odpovědích zde na Stack Overflow:
- Výběr náhodných řádků pomocí MySQL
- randomizace velké datové sady
- rychlý výběr náhodného řádku z velké tabulky v mysql