AKTUALIZACE 2016
Toto řešení funguje nejlépe pomocí indexovaného sloupce .
Zde je jednoduchý příklad a optimalizované vyhledávací pole označené 100 000 řádky.
OPTIMALIZOVÁNO: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
poznámka k limitní částce :limit 4 a 4/počet(*). 4 musí být stejné číslo. Změna počtu návratů neovlivní tolik rychlost. Benchmark na limitu 4 a limitu 1000 jsou stejné. Limit 10 000 to trvalo až 600 ms
poznámka o připojení :Randomizace pouze id je rychlejší než randomizace celého řádku. Vzhledem k tomu, že musí zkopírovat celý řádek do paměti, pak jej randomizovat. Spojení může být jakákoli tabulka, která je propojena s poddotazem Its, aby se zabránilo prohledávání tabulek.
poznamenejte si klauzuli where :Kde počet omezuje množství výsledků, které jsou randomizovány. Vezme procento výsledků a seřadí je spíše než celou tabulku.
pod dotaz na poznámku :Spojení if doing a extra where klauzulové podmínky je musíte vložit jak do poddotazu, tak do poddotazu. Chcete-li mít přesný počet a stáhnout správná data.
NEOPTIMALIZOVÁNO:1200 ms
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
PROS
4x rychlejší než order by rand()
. Toto řešení může pracovat s jakoukoli tabulkou s indexovaným sloupcem.
CONS
Je to trochu složité se složitými dotazy. Potřeba udržovat 2 kódové báze v dílčích dotazech