一尘不染

mysql order by rand()性能问题和解决方案

mysql

我使用rand()命令从数据库中生成随机行而没有任何问题,但我得知随着数据库大小的增加,此rand()会导致服务器负载沉重,因此我正在寻找另一种方法,并尝试通过生成一个随机数使用php
rand()函数并将其作为id放入mysql查询中,这非常快,因为mysql知道行ID,但问题是在我的表中所有数字都不可用。例如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

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

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

上面的查询太慢,导致服务器上的负载很大


阅读 808

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

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

  1. 使用=,但如果找不到匹配项,请使用其他随机值再试一次。有时需要几次尝试,但通常只需一次尝试。本=应该是更快,因为它可以使用的主键。而且,如果它更快,并且90%的时间可以一次尝试,那么一次以上的尝试就可以弥补另外10%的时间。取决于您的ID值中有多少空白。
2020-05-17