首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RAND() alternative命令

RAND() alternative命令
EN

Stack Overflow用户
提问于 2009-12-08 16:26:26
回答 9查看 5.8K关注 0票数 7

可能重复:

MySQL: Alternatives to ORDER BY RAND()

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

这会扼杀查询缓存,这会损害性能。

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

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

(这是一个新产品的列表,我想时不时地调整一下)。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-12-08 17:23:06

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

票数 3
EN

Stack Overflow用户

发布于 2009-12-08 16:32:42

如果您有ID列,最好执行以下操作:

代码语言:javascript
复制
-- 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;

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

代码语言:javascript
复制
SELECT * FROM table ORDER BY RAND LIMIT 40

效率很低,因为MySQL将处理表中的所有记录,对所有行执行完整的表扫描,将它们随机排序。

票数 6
EN

Stack Overflow用户

发布于 2009-12-08 16:30:16

它将关闭缓存,因为每次都需要不同的结果集。您不可能缓存一组随机值。如果要缓存一组结果,请缓存大量随机值集,然后在要使用这些值的子部分内,在sql之外的较小集合内进行随机抓取。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1868102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档