UPPDATERING 2016
Den här lösningen fungerar bäst med en indexerad kolumn .
Här är ett enkelt exempel på och optimerad frågebänk märkt med 100 000 rader.
OPTIMERAD:300 ms
SELECT
g.*
FROM
table g
JOIN
(SELECT
id
FROM
table
WHERE
RAND() < (SELECT
((4 / COUNT(*)) * 10)
FROM
table)
ORDER BY RAND()
LIMIT 4) AS z ON z.id= g.id
notering om gränsbelopp :gräns 4 och 4/antal (*). 4:orna måste vara samma nummer. Att ändra hur många du returnerar påverkar inte hastigheten så mycket. Benchmark vid limit 4 och limit 1000 är samma. Limit 10 000 tog det upp till 600ms
notering om gå med :Att slumpmässigt bara slumpa fram id:t är snabbare än att slumpa en hel rad. Eftersom den måste kopiera hela raden till minnet, slumpmässiga den. Sammanfogningen kan vara vilken tabell som helst som är länkad till underfrågan Its för att förhindra tabellsökningar.
notera var klausul :Where count begränsar mängden resultat som randomiseras. Det tar en procentandel av resultaten och sorterar dem snarare än hela tabellen.
notera underfrågan :If doing joins och extra where-klausulvillkor du behöver för att sätta dem både i underfrågan och undersubfrågan. För att få en korrekt räkning och dra tillbaka korrekta data.
OOPTIMERAD:1200ms
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
PROS
4 gånger snabbare än order by rand()
. Denna lösning kan fungera med alla tabeller med en indexerad kolumn.
NACKER
Det är lite komplext med komplexa frågor. Behöver underhålla 2 kodbaser i underfrågorna