0

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

我在 1000~2000 条记录的表中提取了大约 20 个随机行,其中大部分或全部带有 WHERE 子句。这不会增长太多,可能每年150个。

我也最多查看几千个用户,但这个查询是该网站热门区域的一部分。

我真的需要关注 ORDER BY RAND() 的性能损失吗?我听说过所有关于性能问题的恐怖故事,但是当如此小的桌子不断受到打击时,我并没有发现太多。

我不能为此做缓存。

4

1 回答 1

2

很容易使用ORDER BY RAND()和忘记,但是您必须意识到 MySQL 需要检查每一行,因为RAND()它不是恒定的。

检查 1000 行应该不是问题,但请注意随着时间的推移查询性能。如果您只需要一条记录,您可以在这里找到答案:ORDER BY RAND() 替代

编辑

你说你不能做缓存,但即使是一个小的生成 .php 文件也是一个缓存:)

例如,您可以将 ID 列表存储在缓存中;每次插入或删除数据库记录时都会更新它。然后,您使用 PHP 提取 20 个随机 ID 并使用它们来查询数据库(使用例如IN (4, 7, 10, 45, etc.)

更新

正如 OP 所指出的,如果查询也有条件(即并非表中的每个项目都有资格被选择),则这是不可能的。

于 2012-05-15T03:03:47.800 回答