АКТУАЛИЗИРАНЕ 2016
Това решение работи най-добре при използване на индексирана колона .
Ето прост пример за оптимизиран тест за заявки, отбелязан със 100 000 реда.
ОПТИМИЗИРАН:300 мс
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
забележка относно лимита :ограничение 4 и 4/брой(*). 4-те трябва да са едно и също число. Промяната на броя, които връщате, не влияе толкова на скоростта. Бенчмарк при лимит 4 и лимит 1000 са еднакви. Лимитът от 10 000 го докара до 600 ms
бележка за присъединяване :Рандомизирането само на идентификатора е по-бързо от рандомизирането на цял ред. Тъй като трябва да копира целия ред в паметта, след това го рандомизирайте. Обединяването може да бъде всяка таблица, която е свързана с подзаявката Its за предотвратяване на сканиране на таблици.
забележете клауза къде :Броят където ограничава количеството резултати, които се рандомизират. Той отнема процент от резултатите и ги сортира, а не цялата таблица.
забележете подзаявка :Ако правите присъединява и допълнителни условия where трябва да ги поставите както в подзаявката, така и в подзаявката. За да имате точно преброяване и изтегляне на правилните данни.
НЕОПТИМИЗИРАН:1200 мс
SELECT
g.*
FROM
table g
ORDER BY RAND()
LIMIT 4
ПРЕДИМСТВА
4 пъти по-бързо от order by rand()
. Това решение може да работи с всяка таблица с индексирана колона.
ПРОТИВ
Това е малко сложно със сложни заявки. Трябва да поддържате 2 кодови бази в подзаявките