7

我使用 rand() 的顺序从数据库生成随机行没有任何问题,但我意识到随着数据库大小的增加,这个 rand() 会导致服务器负载过重,所以我正在寻找一种替代方法,我尝试通过生成一个随机数使用 php rand() 函数并将其作为 id 在 mysql 查询中,它非常快,因为 mysql 知道行 id,但问题是在我的表中所有数字都不可用。例如 1、2、5、9, 12这样。

如果 php rand() 生成数字 3,4 等,则查询将为空白,因为没有数字 3、4 等的 id。

从 php 生成随机数的最佳方法是什么,但它应该在该表中生成可用的 no,因此它必须检查该表。请告知。

$id23=rand(1,100000000);
    SELECT items FROM tablea where status='0' and id='$id23' LIMIT 1

上述查询速度很快,但有时会生成数据库中不可用的 no。

    SELECT items FROM tablea where status=0 order by rand() LIMIT 1

上述查询速度太慢,导致服务器负载过重

4

4 回答 4

8

首先,都生成一个从 1 到 MAX(id) 的随机值,而不是 100000000。

那么至少有几个很好的解决方案:

  1. >不使用=

    SELECT items FROM tablea where status='0' and id>'$id23' LIMIT 1
    

    创建一个索引(status,id,items)以使其成为仅索引查询。

  2. 使用=,但如果没有找到匹配项,请使用不同的随机值重试。有时需要多次尝试,但通常只需要一次尝试。=应该更快,因为它可以使用主键。如果它更快并且在 90% 的时间内一次尝试就可以完成,那么当需要多次尝试时,这可能会弥补另外 10% 的时间。取决于您的 id 值有多少差距。

于 2013-01-15T03:49:33.417 回答
8

使用您的数据库从表中找到最大值,生成一个小于或等于该值的随机数,获取 id 大于或等于您的随机数的第一行。无需 PHP。

SELECT items
FROM tablea
WHERE status = '0' and
      id >= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablea))
LIMIT 1
于 2013-01-15T03:56:25.600 回答
1

你是对的,ORDER BY RAND()如果你正在处理大型数据集,这不是一个好的解决方案。根据需要随机化的频率,您可以生成一个带有随机数的列,然后以某个预定义的时间间隔更新该数字。

您将使用该列并将其用作您的排序索引。这适用于重读环境,并在一段时间内产生可预测的随机顺序。

于 2013-01-15T03:47:09.227 回答
1

一个可能的解决方案是使用限制:

$id23=rand(1,$numberOfRows);

SELECT items FROM tablea where status='0' LIMIT $id23 1

这不会产生任何遗漏的行(但正如 hek2mgl 提到的)需要知道选择中的行数。

于 2013-01-15T03:52:30.433 回答