【问题标题】:Will multiplying by rand() in MySQL affect performance? [closed]在 MySQL 中乘以 rand() 会影响性能吗? [关闭]
【发布时间】:2013-05-27 22:20:38
【问题描述】:
SELECT *, (nlike  / (nlike + ndlike)) * rand() AS rnk FROM tbl
order by rnk desc;

我知道 ORDER BY RAND() 对性能非常不利;但是,我主要关心乘以 rand()。这会导致系统变慢吗?有什么替代品吗?

【问题讨论】:

  • 很明显ORDER BY rnkORDER BY RAND()
  • 你想达到什么目的?随机排序?
  • 它基本上是一种算法,可以给那些发帖但没有机会被看到的人提供机会。
  • @inivisal 怎么慢了?

标签: mysql performance random probability


【解决方案1】:

试图以你的方式欺骗​​它是无济于事的。您正在向每条记录添加一个随机计算的新字段,并按此排序,这将需要与 ORDER BY RAND() 完全相同的检索策略。

【讨论】:

  • 那么没有别的办法了吗?乘以 rand() 会不会对性能有害?
  • 乘法与它无关——根本不需要时间。需要时间的是在不使用任何索引的情况下从数据库中获取记录,并且当您按未存储的内容排序时,它不能使用任何索引。
  • 那么什么是好的解决方案?
  • 取决于您要执行的操作。我不知道你的应用程序是什么,所以我无法优化它。
  • 这是一个简单的喜欢和不喜欢的评论应用。我基本上是在尝试按排名对每条评论进行排序。
【解决方案2】:

大概是您试图将结果限制在某个数字上,而不是仅仅对每个人进行排序。

在这种情况下,您可以在where 子句中使用rand() 限制结果,然后根据喜欢/不喜欢公式选择一个随机子集:

select t.*
from t
where rand() < 0.01
order by (nlike  / (nlike + ndlike)) desc

甚至:

order by (nlike  / (nlike + ndlike))*rand() desc

这里提高性能的关键是您在排序之前减少了数据的大小。这是一种稍微不同的思考问题的方式。首先,您正在抽取一个随机样本,然后订购它们。

【讨论】:

    猜你喜欢
    • 2011-02-22
    • 2021-04-18
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多