ORDER BY RAND()的性能命中率?

时间:2012-05-15 02:57:13

标签: php mysql

  

可能重复:
  MySQL: Alternatives to ORDER BY RAND()

我在1000~2000条记录的表格中拉大约20个随机行,大多数或全部附有WHERE子句。这不会增长太多,每年可能增加150个。

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

我真的需要关注ORDER BY RAND()所涉及的性能命中吗?我听过所有关于性能问题的恐怖故事,但是当这样一个小桌子不断被击中时,我找不到多少。

我不能为此做一个缓存。

1 个答案:

答案 0 :(得分:2)

ORDER BY RAND()很容易被使用和遗忘,但你必须意识到MySQL需要检查每一行,因为RAND()不是常数。

检查1000行应该不是问题,但要随时关注查询性能。如果你只需要一条记录,你可以在这里找到答案:ORDER BY RAND() alternative

修改

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

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

<强>更新

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