mysql - ORDER BY RAND() 替代方案

标签 mysql performance random

<分区>

Possible Duplicate:
MySQL: Alternatives to ORDER BY RAND()

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

这会杀死查询缓存,从而损害性能。

您能否建议另一种方法来获取随机(ish)结果集,这些结果会不时变化?它不必每小时,也不必完全随机。

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

(这是一个新产品列表,我想不时地对它们进行一些调整)。

最佳答案

如果您有 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;

选择随机id号的逻辑可以移到应用层。

SELECT * FROM table ORDER BY RAND LIMIT 40

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

关于mysql - ORDER BY RAND() 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868102/

相关文章:

algorithm - 如何生成伪随机对合?

php - Laravel 中带有 where 条件的数据库字段值的总和

php - 从单一表单将数据插入到多个 SQL 表中

performance - 通过减少 for 循环数量来加速

performance - 使用链式与开放式寻址的哈希表中的缓存性能

java - 测试随机盐法

php - 当从另一页面发布一个日期时比较mysql中的日期

php - 通过ajax将表单值从一个表单传递到另一个表单并返回到第一个表单

c++ - 有没有更有效的方法来包装 float ?

random - 您可以实现的随机二进制数据的最佳文件压缩是什么?