关于大数据量中抓取数据的问题,

在项目中遇到一个问题,需求是这样的:

数据库中一张表,有几十万条用户记录,要求每隔一段时间(不能超过一个小时)就从这些数据中抓取一部分出来(大约1000条),要确保用户记录能均匀的被抓取到。

我现在的做法是,启用一个定时程序,每隔10分钟就从数据库里面随机抓取500条记录。但是好像不能做到均匀。
另外还要考虑下性能问题,数据库为mysql

有什么好的方法能确保均匀?
问题补充

bureaucrat 写道
问题是:你怎么判断的不均匀?


测试的结果能看出来,定时器运行了3天
抓取的情况是,有的记录被抓到很多次,有的记录一次都没有被抓到,我希望能够尽量均匀的分配

如果是单纯的想要随机把所有的抽取完得话,用自带的随机函数能够保证随机,但是在一个范围内是不一定能够全部的数据都获取的,个人认为可以设计一个数学算法,先将数据排序后进行随机抽取(但是在给定的范围内全部都要抽取到).

问题是:你怎么判断的不均匀?

你是想说如果抓到了,就不能再抓?

怎么随机的?
[code="java"]select * from (select * from test_tab order by dbms_random.random) where rownum < 1000[/code]
抓到好几次也正常,3天太短,30天就均匀了 :shock:

是不是可以按照一定的规律来抓取。
比方说今天这个时间点 抓取 用户ID在(0,1000)的区间,

自己安排好数量级,
这样抓取基本可以抓的全,抓的均匀就看数量级的划分了。

在这里,不论你的“随机抓取500条记录”的设计方法是否可行!

至少一点,你的测试该方法不行!

随便支个招
几十万的数据,不算大,如果怕影响真实环境,完全可以在你的开发机子上把数据给架起来
10分钟取一条!NO,太慢了,你就下班回家的时候,把你的测试程序给打开
一次才500条,我算你机器非常慢,1秒能取一次数据吧?
好,1个小时能取3600次,10个小时。。。。
如果你还嫌慢,借你同事的机器吧。。。。。。

关键在于均匀怎么定义了,建立一个优先级规则,比如同一记录被抓取的次数越高,优先级越低,这样就均匀了....

这样嘛,把几十万数据分1000组,每次从每个组里顺次取1条
:shock:

这个随机是怎么随的呢,楼主应该明白

随过的备份就行了吧

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一次补足,注意避免重复

开源框架quartz,进行定时任务的配置,你只需要来设置具体的业务类就ok!

可以这样么?比如你十万数据,你的均匀是一周算一次!那么可以计算一周你可以取所有数据几遍,比如说10遍吧,那么可以给定一个正态分布计算,比如计算出来6-12之间为均匀,你可以取到超过12次的以后不再取了!当然还得限制一下下限,

哈,又想到一种,比如100数据,放在集合zero中每次取10个,每次取到后权+1,权为1的放在一个集合假设名为one中,权为2的放集合two中,类推。。。取一次过后把one中取十个放回zero中,如不足10个从two中取补足,这样不知道可以保证均匀不?

建个备份表,抓过后就删掉。再抓的自然是没被抓过的。

然后,所有的记录都抓完后,再重建表。

 

set @temp=i, @space=(j - i)/num

 

select *, @temp := (@temp + @space) test from test having time - @temp > @space;  


其中 变量 i 为开始时间 , j 为结束时间 , num 为需要取得的数据条数

 

希望能帮到你