Výběr náhodných řádků je vždy ošemetný a neexistují žádná dokonalá řešení, která by nezahrnovala nějaký kompromis. Buď ohrozte výkon, nebo dokonce náhodné rozdělení, nebo ohrozte možnost výběru duplikátů atd.
Jak zmiňuje @JakeGould, jakékoli řešení s ORDER BY RAND()
špatně měřítko. Jak se počet řádků ve vaší tabulce zvětšuje, náklady na řazení celé tabulky v řazení souborů se zhoršují a zhoršují. Jake má pravdu, že dotaz nelze uložit do mezipaměti, když je pořadí řazení náhodné. Ale o to se tolik nestarám, protože obvykle stejně vypnu mezipaměť dotazů (má své vlastní problémy se škálovatelností).
Zde je řešení, jak předem náhodně řadit řádky v tabulce vytvořením sloupce rownum a přiřazením jedinečných po sobě jdoucích hodnot:
ALTER TABLE products ADD COLUMN rownum INT UNSIGNED, ADD KEY (rownum);
SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();
Nyní můžete získat náhodný řádek vyhledáváním indexu, bez řazení:
SELECT * FROM products WHERE rownum = 1;
Nebo můžete získat další náhodný řádek:
SELECT * FROM products WHERE rownum = 2;
Nebo můžete získat 10 náhodných řádků najednou nebo jakékoli jiné číslo, které chcete, bez duplicit:
SELECT * FROM products WHERE rownum BETWEEN 11 and 20;
Randomizaci můžete kdykoli změnit:
SET @rownum := 0;
UPDATE products SET rownum = (@rownum:[email protected]+1) ORDER BY RAND();
Náhodné třídění je stále nákladné, ale nyní to nemusíte dělat u každého dotazu SELECT. Můžete to udělat podle plánu, doufejme, že v časech mimo špičku.