Anledningen till att beställning efter RAND()
kan vara långsam är att du tvingar databasen att faktiskt sortera hela tabellen innan du returnerar något. Att bara minska belastningen till en enda tabellskanning är mycket snabbare (även om det fortfarande är något långsamt).
Det betyder att du kan komma en del av vägen bara genom att undvika beställningen:
SELECT *
FROM my_table
WHERE RAND() < 0.1
ORDER BY RAND()
LIMIT 100
Detta kommer att välja ungefär 1 % av alla rader i tabellen, sortera dem och returnera de 100 bästa. Observera bara att huvudproblemet här (liksom med @cmds svar) är att du inte kan vara säker på att frågan returnerar någonting alls.
Tillvägagångssättet ovan bör involvera en hel tabellskanning (för att bestämma vilka rader som ska användas) följt av ungefär 1 % av raderna. Om du har många rader kan du minska andelen i enlighet med detta.