基于字段的数据采样

时间:2012-03-20 23:22:01

标签: java mysql statistics sampling

我想基于时间戳字段对数据进行采样。我正在阅读巨大的数据文件,每天都有接近百万的记录。我每个月都有几个这样的文件。

现在我想读取这些数据,但是只将5%或10%存储到mysql数据库中。我没有事先知道每个数据文件中的记录数。

有什么方法可以只为文件的总读取数据的5%采样?对这类问题有没有标准的统计方法?

根据以下评论进行编辑:

在此抽样想法之前,我在两个字段上创建了一个基于密钥的分区和索引:id和date。 id字段更像是clientId。即使进行分区,在1千5百万行的2个字段组也需要花费很长时间,在30-60分钟的范围内。我还在其中一个分组字段中创建了附加索引。

我的解释会显示:

  

SIMPLE访问参考文献3ColumnerIndex,2ColumnIndex 2ColumnIndex 302 const 7493642使用where;使用filesort

在给innodb一个4 GB的缓冲区后获得了这个性能!

2 个答案:

答案 0 :(得分:1)

你需要估计这个记录的数量,但如果你没有严格要求你需要多少样本,这应该不是问题:

  1. 假设您从k条记录中选择n个样本。
  2. 对于每条记录,或直到您有足够的记录:
    1. 生成0到1之间的随机数。
    2. 如果小于k/n,则输出当前记录。放k := k-1n := n-1
    3. 否则,丢弃记录并放入n := n-1
  3. 每条记录以概率k / n出现在输出中。例如。出现第二条记录的概率为:

    (k/n)*(k-1)/(n-1) + ((n-k)/n)*k/(n-1) = (k-1+n-k)*k/(n*(n-1)) = k/n
    

答案 1 :(得分:-1)

您可以使用限制

SELECT name, email FROM users WHERE name LIKE 'a%' LIMIT 10;

但我也发现这个链接可能会更具体地帮助你

http://www.gloomy.eu/mysql-desired-percentage-of-rows/