MySQL 每次随机取一些值,下次在剩下的数据池中再取,有什么好的解决方法吗?

2017-04-22 12:25:36 +08:00
 rogwan
从数据表中查询数值,分批次用,每次 10 条。用 order by rand() 之后,第一次用 10 条,第二次再用 10 条的时候,结果又 rand 了一次(搞得第二次取的 10 条数据中,有部分和第一次取的 10 条数据有重合)。

我想第二次用的 10 条数据,不要和第一次用的 10 条数据有重复;每次随机取值都是在剩下的数据池中取,有什么好的解决方法吗?
4154 次点击
所在节点    MySQL
14 条回复
bosshida
2017-04-22 13:19:37 +08:00
增加一个字段 is_used ,用过就更新一下?
Jodal
2017-04-22 14:47:21 +08:00
一个方案是增加一个 where 过滤,然后 rand 。如 select * from table_name where id > x 。下次改变 x 值。第二个方案是 redis cache 起来取每次取完 10 条后, set 删除这 10 条,下次再取 10 条。仅供参考。
mringg
2017-04-22 14:54:36 +08:00
分页。。。。
moult
2017-04-22 14:59:23 +08:00
加一个 rand_val 字段,每次插入的时候,就产生一个随机数写入。
读取的时候,也生成一个随机数作为条件进行查询
先查询 where rand_val > ? order by rand_val 如果没有结果,就查询 where rand_val < ? order by rand_val desc
也就是查询这个随机数附近的记录
读取之后,标记 rand_val=0 表示读取过了!
dsg001
2017-04-22 17:22:20 +08:00
读取所有 id 乱序保存,使用时读取切片
rogwan
2017-04-22 20:22:42 +08:00
@mringg 分页就是会出现我说的问题(第二页的内容 和 第一页的内容可能会有重复的部分)

@dsg001 你了解这样做数据量大了,查询性能会大幅下降吗?
rogwan
2017-04-22 20:27:12 +08:00
@Jodal
@moult

查了下资料,用 rand 加 seed ,然后再设置 offset 和 limit 。这样看起来好像没有重复了,现在数据量少,不知道实际性能是不是高效?
ioioioioioioi
2017-04-22 20:29:34 +08:00
增加一个 random 字段,每小时更新
whileFalse
2017-04-22 20:50:25 +08:00
@rogwan 如果数据量很大的话,第二次查询 10 条出现第一次查询的结果的可能性非常低。
而且如果数据量大,生成一次随机列表可以用很久
所以数据量大你无论用哪种方式都没问题。
dsg001
2017-04-22 20:59:57 +08:00
@rogwan 准备每次都查询全部 id ?一次查询保存到内存,然后切片使用,再有需要则更新内存数据
kokutou
2017-04-22 21:36:59 +08:00
那么问题来了。。。
为啥不一次取 20 条。
ghostheaven
2017-04-23 00:27:43 +08:00
取出来的放到另一张表 b 里,取的时候 left join 一下这张表,多加个判断 where b.id is null
abcbuzhiming
2017-05-10 09:02:39 +08:00
@rogwan 我跟你说你这个问题我遇到过,我们的试验结论是 mysql 在随机查询上的性能完全无法接受,从 100w 样本中抽数据速度就会掉到需要 5-6 秒的程度(机械硬盘 7200 转)。后来我们是用 redis,把数据弄到缓存里,直接用代码随机,从缓存中抽取来解决的
rogwan
2017-05-10 12:24:33 +08:00
@abcbuzhiming 是的,后来我们也测试了一下,样本还没你 100w 那么多,就发现速度不行了。

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

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

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

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

© 2021 V2EX