ORDER BY RAND()
is traag omdat het DBMS alle rijen moet lezen, ze allemaal moet sorteren, om maar een paar rijen te behouden. De prestatie van deze query hangt dus sterk af van het aantal rijen in de tabel en neemt af naarmate het aantal rijen toeneemt.
Er is geen manier om dat te optimaliseren.
Er zijn echter alternatieven:
U kunt "krijg 5 willekeurige rijen" implement implementeren door 6 zoekopdrachten uit te voeren:
- haal het aantal rijen in de tabel (u kunt deze in de cache plaatsen)
-
voer 5 queries uit met
OFFSET <random offset from 0 to $number_of_rows-1> LIMIT 1
(d.w.z. lees en retourneer slechts één rij van een willekeurige verschuiving)Bijvoorbeeld:
SELECT * FROM Products OFFSET 42 LIMIT 1
(let op:voorlopig zonder lid te worden)Dergelijke zoekopdrachten zijn erg snel en worden uitgevoerd in een tijd die vrijwel onafhankelijk is van de tabelgrootte.
Dit zou veel moeten zijn sneller dan ORDER BY RAND()
.
Om nu een willekeurige afbeelding te krijgen voor elk willekeurig product:
SELECT *
FROM (
SELECT *
FROM Products
OFFSET 42 LIMIT 1
) p
JOIN ProductImages pi
ON pi.product_id = p.id
ORDER BY RAND()
LIMIT 1
De binnenste zoekopdracht is nog steeds snel en de buitenste sorteert maar een paar rijen (ervan uitgaande dat er maar weinig afbeeldingen per product zijn), en kan dus nog steeds volgorde op rand() gebruiken.