使用MySQL和PHP获取不重复的随机元素
我有一个场景,我需要从一组条目中找到一个随机的赢家 条目可以多次出现,现在我获取所有按用户ID分组的记录,并使用PHP的array_rand()方法找到一个随机的赢家。分组用于避免重复的元素 在这里,我面临两个问题使用MySQL和PHP获取不重复的随机元素,php,mysql,Php,Mysql,我有一个场景,我需要从一组条目中找到一个随机的赢家 条目可以多次出现,现在我获取所有按用户ID分组的记录,并使用PHP的array_rand()方法找到一个随机的赢家。分组用于避免重复的元素 在这里,我面临两个问题 查询正在超时,因为它正在处理将近10000000条记录 PHP内存因大量记录而耗尽 我当前的查询很简单,如下所示 SELECT id, userID from table where id!= 1111 and created_at >='2017-08-10' group b
SELECT id, userID from table where id!= 1111 and created_at >='2017-08-10' group by userID
在这种大规模应用中,最佳的方法是什么?使用ORDER BY RAND()
并将结果限制为1,以避免内存耗尽
SELECT id, userID
from table
where id!= 1111 and created_at >='2017-08-10'
group by userID
ORDER BY RAND()
LIMIT 1;
希望这会有帮助
SELECT userID
FROM table AS t1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(userID)
FROM table)) AS userID)
AS t2
where id!= 1111 and created_at >='2017-08-10'
ORDER BY t1.userID ASC
LIMIT 1
尝试在SQL中执行所有操作,可能会更快
SELECT id, userID
FROM table
WHERE id!= 1111 and created_at >='2017-08-10'
GROUP BY userID
ORDER BY RAND()
LIMIT 1;
好的,如果您只需要一个用户,您可以添加一个
限制0,1
。最后,您只需要一个:)但这可能不是随机的。让mySQL为你做这件事+1这会起作用,但当查询直接在服务器上运行时,完成查询大约需要22秒。因此,我认为一旦我们考虑到网络传输延迟,延迟就会增加。但是,是的,它将只返回一条记录。如果表很大,则通常需要几秒钟,因为您在where子句中使用了范围,这可能是它需要这么长时间的问题。这会起作用,但当查询直接在服务器上运行时,完成查询需要大约22秒。因此,我认为一旦我们考虑到网络传输延迟,延迟就会增加。但是是的,它只会返回一个record@HappyCoder列ID和创建位置是否已编制索引?用户标识呢这两个字段都是索引字段。@HappyCoder是否与explain一起检查索引使用是否正确?索引不保证它将使用索引。是的,它取决于索引的定义方式。你能检查一下解释计划并告诉我们结果吗?