大规模数据导入实验
在上一个实验 中,我们测试了导入数据的性能,简单总结一下测试方法:
1. Schema: 每行数据三个字段,日期、ID和当日流量,都是长整型
2. Index: inventory.create_index([('date',ASCENDING), ('id',ASCENDING)], unique=False, dropDups=False)
3. 用mongoimport导入csv数据
随后我们在大规模的数据上进行了测试,导入360天的数据,每天100万行记录。同样的数据导入两次,由于索引不是unique的,最终的数据库里每天每个ID有会两条数据,总共720M行记录。以下是测试结果:
测试 | 时间 | 数据行数 | 磁盘占用 |
---|---|---|---|
导入360天数据,每天100万行记录 | 平均50秒/天 | 360M | 74GB |
在前面导入的基础上再一次导入同样的数据 | 平均60秒/天 | 720M | 141GB |
查询性能实验
在前面两次导入数据的基础上,我们测试了数据查询性能。在我们的应用里,主要场景是随机查询某个ID最近两个月的数据,所以测试方法如下:
1. 清空系统缓存
echo 3 > /proc/sys/vm/drop_caches (需要root权限)
2. 随机选取1000个ID,查询最近60天的流量
inventory.find({'date':{'$gte':today - 60 * 86400, '$lte':today},'id':id})
3. 计算平均查询时间
结果如下:
1. 查询最近60天的数据,每个查询返回120条记录,平均时间是0.28秒
2. 查询总共360天的数据,每个查询返回720条记录,平均时间是4.26秒
这样的性能对我们目前的应用来说足够了:)