php - 根据要求从 50k 行表中选择随机行。太慢了。我怎样才能加快速度?

标签 php mysql

我有一个大约有 50k 行的表。有一个名为 status 的列。它的值可以是 01。我需要获取 status = 0 的随机行。

SELECT * FROM table WHERE status = 0 ORDER BY RAND() LIMIT 1 显然太慢了。

所以,到目前为止我所做的是,使用 SELECT COUNT(status) FROM table WHERE 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 进行排序应该相当快。

编辑:

有效地获取随机值具有挑战性。如果您在 table(status) 上有索引,则可以尝试如下方法:

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;

where 子句中的 rand() 速度相当快(RAND() 快,排序慢)。它应该大大减少行数到预期值 10——这意味着当你运行它时你几乎肯定会得到一行(我认为是 99.99+%)。这也比变量方法简单。

变量方法涉及子查询,子查询会产生读写派生表的开销。这个想法是枚举行,然后随机选择一个索引:

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;

关于php - 根据要求从 50k 行表中选择随机行。太慢了。我怎样才能加快速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468616/

相关文章:

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP

php - 将 IPTables 输出拆分为数据库的多维数组

mysql - Node js 数据库中的 Braintree 集成问题

mysql 错误 - 组函数的无效使用

php - 当 left join 返回 null 时,'where' 条件失败

php - 在插入之前检查值,如果已经存在,请不要在php中使用mysql插入它

php - 多语言 URL 结构上的重复内容

php - JavaScript 中的 Get_option() 错误?

php - JSON 编码/解码无法正常工作

mysql - 登录phpMyAdmin后无法访问主页