Php 根据50k rows表中的要求随机选择一行。太慢了。我怎样才能加快速度?

Php 根据50k rows表中的要求随机选择一行。太慢了。我怎样才能加快速度?,php,mysql,Php,Mysql,我有一张大约5万行的桌子。有一个专栏叫status。其值可以是0或1。我需要获取一个状态为0的随机行 从表中选择*,其中状态=0,按兰德订购限制1明显太慢 所以,到目前为止,我所做的是,使用selectcountstatus从status=0的表中获取status=0的行数 现在我有209行的status=0,但是如何处理这些行呢 我想对这209行进行排序,并使我的php脚本获得一个介于0和209之间的随机行号,但我不确定如何实现这一点。您尝试过这个吗 SELECT t.* FROM table

我有一张大约5万行的桌子。有一个专栏叫status。其值可以是0或1。我需要获取一个状态为0的随机行

从表中选择*,其中状态=0,按兰德订购限制1明显太慢

所以,到目前为止,我所做的是,使用selectcountstatus从status=0的表中获取status=0的行数

现在我有209行的status=0,但是如何处理这些行呢

我想对这209行进行排序,并使我的php脚本获得一个介于0和209之间的随机行号,但我不确定如何实现这一点。

您尝试过这个吗

SELECT t.*
FROM table t
WHERE status = 0
ORDER BY RAND()
LIMIT 1;
分拣209应该很快

编辑:

有效地获取随机值是一项挑战。如果在tablestatus上有索引,可以尝试以下方法:

SELECT t.*
FROM table t cross join
     (select count(*) as allcnt from table where status = 0) const
WHERE status = 0 and
      RAND() < 10/allcnt
ORDER BY RAND()
LIMIT 1;

我知道这需要两个查询,但您可以尝试一下并对其进行基准测试:获取与status=0匹配的行的总数,从PHP获取一个介于0和该数字-1之间的随机数,使用限制1和php生成的随机值的偏移量执行select查询。

您应该能够将WHERE子句应用于原始查询:select*FROM table WHERE status=0 ORDER by RAND limit 1显然太慢了,它不应该只用于50k行。@PLANTHEIDEA是的,我很抱歉,我已经有了,但是我忘了键入它。@zerkms每行有15列。我早些时候在phpmyadmin上运行了上面的查询,它花了13秒来处理。远程执行同样的操作,耗时53秒。@viniciusmunich:如果只返回1条记录,我真的想不出远程速度慢4倍的原因。是的,速度很快,但每天午夜,所有行都会更新,并且它们的状态设置为0。因此,在午夜,查询必须排序5万行。那会有多快?@viniciusmunich。与您最初的查询一样快,与您发布的问题完全不同。但是,我给出了三种选择,其中一种肯定是三种方法中最快的。使用第二种方法,我的VPS负载从0.10增加到129.90,直到我重新启动MySQL。问题是每个查询都必须解密一个字符串,我认为这是导致高负载的原因。第三个方法返回零行:MySQL返回一个空结果集,即零行。查询使用了0.1686节。第三个方法没有返回任何行,因为我在@rand的赋值中缺少分号。但是,如果获取一行的开销如此大,我认为这将不会有帮助。
SELECT t.*
FROM (select t.*, @rn := @rn + 1 as rn
      from table t cross join
           (select @rn := 0, @rand := rand()) const
      where status = 0
     ) t cross join
     (select count(*) as allcnt from table where status = 0) const
WHERE floor(1 + @rand * const.allcnt) = rn;