ORDER BY RAND()替代方案

Rik*_*ood 7 mysql random performance

可能重复:
MySQL:ORDER BY RAND的替代品()

我目前有一个查询结束,ORDER BY RAND(HOUR(NOW())) LIMIT 40以获得40个随机结果.结果列表每小时更改一次.

这会终止查询缓存,这会破坏性能.

你能否建议另一种方法来获得随时变化的随机(ish)结果集?它不一定是每个小时,也不一定是完全随机的.

我更喜欢随机结果,而不是在表格中的任意字段上排序,但我会这样做作为最后的手段......

(这是我想要随时改变的新产品列表).

Yad*_*ada 6

如果你有一个ID列,最好做一个:

-- create a variable to hold the random number
SET @rownum := SELECT count(*) FROM table;
SET @row := (SELECT CEIL((rand() * @rownum));

-- use the random number to select on the id column
SELECT * from tablle WHERE id = @row;
Run Code Online (Sandbox Code Playgroud)

选择随机id号的逻辑可以移动到应用程序级别.

SELECT * FROM table ORDER BY RAND LIMIT 40
Run Code Online (Sandbox Code Playgroud)

是非常低效的,因为MySQL将处理表中的所有记录,对所有行执行全表扫描,随机排序.


mon*_*ksy 5

它会杀死缓存,因为你每次都期望得到不同的结果集.您无法缓存一组随机值.如果要缓存一组结果,请缓存一大组随机值,​​然后在您要使用这些值的子部分内,在较小的集合[sql]之外进行随机抓取.


And*_*gin 3

我认为更好的方法是将产品标识符下载到中间层,在需要时选择随机 40 个值(每小时一次或针对每个请求)并在查询中使用它们:product_id in (@id_1, @id_2, ..., @id_40)