我有一个大约有 50k 行的表。有一个名为 status
的列。它的值可以是 0
或 1
。我需要获取 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/