gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:07:51 25 4
gpt4 key购买 nike

我有一个大约有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com