从 mysql 随机查询 10 条数据

2023-03-04 17:26:07 +08:00
 brader
有什么高效的实现方案吗?需要每次请求过来都是随机的 10 条返回
2870 次点击
所在节点    MySQL
14 条回复
Akitora
2023-03-04 17:32:45 +08:00
order by rand() limit 10
falsemask
2023-03-04 18:00:55 +08:00
主键存 redis ,用 redis 的随机函数
MMMMMMMMMMMMMMMM
2023-03-04 18:23:08 +08:00
线性同余吧,都常数,不占计算资源
https://zh.wikipedia.org/zh-hans/%E7%BA%BF%E6%80%A7%E5%90%8C%E4%BD%99%E6%96%B9%E7%A8%8B

SELECT * FROM (
SELECT *, ((@seed := (@seed * 1103515245 + 12345) % (2 ^ 32)) / (2 ^ 32)) AS rand_num
FROM table_name, (SELECT @seed := RAND()) AS seed_table
ORDER BY rand_num
) AS random_table LIMIT 10;

思路就这样,脏活 gpt 干的,看起来可以跑,自行验证

a b m 可以自己调整,比如想更"随机"点,整个时间戳放进去之类的
MMMMMMMMMMMMMMMM
2023-03-04 18:29:22 +08:00
哦,傻屌 gpt 果然不能直接信,他还是用了 rand()

SELECT * FROM (
SELECT *, (UNIX_TIMESTAMP() * (@seed := (@seed * UNIX_TIMESTAMP() + 1) % (2 ^ 31 - 1)) / (2 ^ 31 - 1)) AS rand_num
FROM table_name, (SELECT @seed := UNIX_TIMESTAMP()) AS seed_table
ORDER BY rand_num
) AS random_table LIMIT 10;

这该对了
auh
2023-03-04 18:44:15 +08:00
数据库里面只放 10 条记录
makelove
2023-03-04 19:20:10 +08:00
数据量大又要高效的话表加一列随机数列并加索引,可定期重置
netnr
2023-03-04 19:42:32 +08:00
先 count(*) 总行(可以缓存),程序生成 10+ 的随机 ID (范围在 1- count )
如果自增是主键直接使用主键查询一条,然后 union all 10+ 的查询,这种方式性能应该是最好的
查询 10+ 是考虑删除的情况,最终只返回 10 条

不是自增可以 row_number 加一列序号,在 in ,性能不高
LeegoYih
2023-03-04 19:52:21 +08:00
id 连续自增,应用服务随机生成 10 个数,用 in(...)查
id 不连续,定时任务查库,随机放一些数据到 rediis ,然后接口从 redis 中随机取 10 条,和热门商品的思路一样
kenvix
2023-03-04 20:23:01 +08:00
看你的表的情况
ID 是否连续没有中断?
是否可以接受一次随机查询得到的条目少于规定数目?
是否要求高度随机?能否接受一块连续数据?
vace
2023-03-04 21:35:59 +08:00
之前做过百万递增 ID 的用户中随机匹配 N 个,取 maxID ,随机生成 2N 个编号,取出后排除无效用户,一般一次就够了,如果不足,就递归再取一次合并。
YVAN7123
2023-03-04 22:14:21 +08:00
@vace 取 2N 太厉害了
ldyisbest
2023-03-04 22:48:04 +08:00
SELECT name
FROM random AS r1 JOIN
(SELECT CEIL(RAND() *
(SELECT MAX(id)
FROM random)) AS id)
AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1
ldyisbest
2023-03-04 22:48:37 +08:00
opengps
2023-03-04 22:52:12 +08:00
先随机 id,再 where id in

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/921128

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX