mysql命令由rand()性能问题和解决方案

rav*_*ves 7 php mysql

我正在使用rand()的命令从数据库生成随机行而没有任何问题,但我重申,随着数据库大小的增加,这个rand()导致服务器上的负载很重,所以我正在寻找替代方案,我试着生成一个随机数使用php rand()函数并将其作为id放在mysql查询中,并且它非常非常快,因为mysql知道行id但问题在我的表中所有数字都不是availbale.例如1,2,5,9, 12那样的.

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

什么是从PHP生成随机数的最佳方法,但它应该在该表中生成可用的no,因此它必须检查table.please建议.

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

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

    SELECT items FROM tablea where status=0 order by rand() LIMIT 1
Run Code Online (Sandbox Code Playgroud)

上面的查询太慢,导致服务器负载过重

pyr*_*ade 9

使用数据库从表中查找最大值,生成小于或等于该值的随机数,抓住id大于或等于随机数的第一行.不需要PHP.

SELECT items
FROM tablea
WHERE status = '0' and
      id >= FLOOR(1 + RAND() * (SELECT MAX(id) FROM tablea))
LIMIT 1
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 7

首先,所有都生成从1到MAX(id)的随机值,而不是100000000.

然后至少有几个很好的解决方案:

  1. 使用>=

    SELECT items FROM tablea where status='0' and id>'$id23' LIMIT 1
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 使用=,但如果找不到匹配则只需使用其他随机值重试.有时需要多次尝试,但通常只需要一次尝试.本=应该是更快,因为它可以使用的主键.如果它更快并且在90%的时间内一次尝试,那么当需要多次尝试时,这可以弥补其他10%的时间.取决于您的id值中有多少差距.

  • 无论哪种方式,它都比ORDER BY RAND()好得多.:-) (2认同)