问题描述
在项目中遇到一个问题,需求是这样的:数据库中一张表,有几十万条用户记录,要求每隔一段时间(不能超过一个小时)就从这些数据中抓取一部分出来(大约1000条),要确保用户记录能均匀的被抓取到。我现在的做法是,启用一个定时程序,每隔10分钟就从数据库里面随机抓取500条记录。但是好像不能做到均匀。另外还要考虑下性能问题,数据库为mysql有什么好的方法能确保均匀?问题补充bureaucrat 写道
解决方案
如果是单纯的想要随机把所有的抽取完得话,用自带的随机函数能够保证随机,但是在一个范围内是不一定能够全部的数据都获取的,个人认为可以设计一个数学算法,先将数据排序后进行随机抽取(但是在给定的范围内全部都要抽取到).
解决方案二:
解决方案三:
建个备份表,抓过后就删掉。再抓的自然是没被抓过的。然后,所有的记录都抓完后,再重建表。
解决方案四:
哈,又想到一种,比如100数据,放在集合zero中每次取10个,每次取到后权+1,权为1的放在一个集合假设名为one中,权为2的放集合two中,类推。。。取一次过后把one中取十个放回zero中,如不足10个从two中取补足,这样不知道可以保证均匀不?
解决方案五:
可以这样么?比如你十万数据,你的均匀是一周算一次!那么可以计算一周你可以取所有数据几遍,比如说10遍吧,那么可以给定一个正态分布计算,比如计算出来6-12之间为均匀,你可以取到超过12次的以后不再取了!当然还得限制一下下限,
解决方案六:
开源框架quartz,进行定时任务的配置,你只需要来设置具体的业务类就ok!
解决方案七:
10万, 1000条/次 100000 / 1000 = 100次第一次。。where id % 100 = 0第二次。。where id % 100 = 1。。。第100次。。where id % 100 = 99---------如果不能每次循环的时候取相同数据,可以修改下,把id % 100做一些调整id % n即在每次重新循环的时候调整n(n是个随机数,限制在一个范围内,避免每次抓过多数据或太少数据引起太多次select),n<100的时候随机取其中1000条,n大于100时,再select一次补足,注意避免重复
解决方案八:
这个随机是怎么随的呢,楼主应该明白随过的备份就行了吧
解决方案九:
这样嘛,把几十万数据分1000组,每次从每个组里顺次取1条
解决方案十:
关键在于均匀怎么定义了,建立一个优先级规则,比如同一记录被抓取的次数越高,优先级越低,这样就均匀了....
解决方案十一:
在这里,不论你的“随机抓取500条记录”的设计方法是否可行!至少一点,你的测试该方法不行!随便支个招几十万的数据,不算大,如果怕影响真实环境,完全可以在你的开发机子上把数据给架起来10分钟取一条!NO,太慢了,你就下班回家的时候,把你的测试程序给打开一次才500条,我算你机器非常慢,1秒能取一次数据吧?好,1个小时能取3600次,10个小时。。。。如果你还嫌慢,借你同事的机器吧。。。。。。
解决方案十二:
是不是可以按照一定的规律来抓取。比方说今天这个时间点 抓取 用户ID在(0,1000)的区间,自己安排好数量级,这样抓取基本可以抓的全,抓的均匀就看数量级的划分了。
解决方案十三:
怎么随机的?select * from (select * from test_tab order by dbms_random.random) where rownum < 1000抓到好几次也正常,3天太短,30天就均匀了
解决方案十四:
你是想说如果抓到了,就不能再抓?
解决方案十五:
问题是:你怎么判断的不均匀?