UPDATE 2016
Deze oplossing werkt het beste met een geïndexeerde kolom .
Hier is een eenvoudig voorbeeld van een geoptimaliseerde querybench, gemarkeerd met 100.000 rijen.
GEOPTIMALISEERD:300ms
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
opmerking over limietbedrag :limiet 4 en 4/count (*). De 4s moeten hetzelfde nummer zijn. Wijzigen hoeveel u retourneert, heeft niet zoveel invloed op de snelheid. Benchmark bij limiet 4 en limiet 1000 zijn hetzelfde. Limiet 10.000 duurde tot 600 ms
opmerking over meedoen :Het willekeurig maken van alleen de id is sneller dan het willekeurig maken van een hele rij. Omdat het de hele rij naar het geheugen moet kopiëren, moet het willekeurig worden gemaakt. De join kan elke tabel zijn die is gekoppeld aan de subquery. Het is om het scannen van tabellen te voorkomen.
let op waar clausule :De waar-telling beperkt het aantal resultaten dat wordt gerandomiseerd. Het neemt een percentage van de resultaten en sorteert ze in plaats van de hele tabel.
let op subquery :De if-doing joins en extra where-clausulevoorwaarden die u zowel in de subquery als de subsubquery moet plaatsen. Om een nauwkeurige telling te hebben en correcte gegevens terug te halen.
NIET GEOPTIMALISEERD:1200ms
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
PRO'S
4x sneller dan order by rand()
. Deze oplossing werkt met elke tabel met een geïndexeerde kolom.
CONS
Het is een beetje ingewikkeld met complexe vragen. Noodzaak om 2 codebases in de subquery's te behouden