大约有2000个连接,每5分钟轮询一次,每天大约有60万行新数据。在Postgres中,我们将这些数据按天存储:
t_usage {service_id, timestamp, data_in, data_out} t_usage_20100101继承自t_usage。 t_usage_20100102继承自t_usage。等等。
我们使用一个乐观的存储过程来写入数据,假定分区存在并在必要时创建它。我们可以非常快速地插入数据。
对于数据的读取,我们按重要性和当前性能顺序列出了以下用例:
* 单个服务,单日使用:性能良好 * 多个服务,月度使用情况:性能差 * 单个服务,月度使用情况:性能差 * 多个服务,多个月份:性能非常差 * 多个服务,单日使用:性能良好
这是有道理的,因为分区是针对天数进行优化的,这是我们最重要的用例。但是,我们正在寻找改进次要需求的方法。
我们经常需要通过小时参数化查询,例如,仅在上午8点到下午6点之间给出结果,因此摘要表的用处有限。(这些参数的更改频率足够高,以至于创建多个摘要数据表是不可行的)。
在此背景下,第一个问题是:CouchDB是否适合此数据?如果是,考虑到上述用例,您将如何最好地在CouchDB文档中建模数据?我已经列出了一些选项,我们正在进行基准测试(_id、_rev除外):
每天每个连接一个文档。
{
service_id:555
day:20100101
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
每月大约有6万份新文件。其中大部分新数据都是对现有文件的更新,而不是新文件。
(在这里,使用的对象是基于轮询时间戳的,值为传入和传出的字节)。
每个连接每月只能有一个文档
{
service_id:555
month:201001
usage: {1265248762: {in:584,out:11342}, 1265249062: {in:94,out:1242}}
}
每个月大约有2,000份新文档需要处理。还需要适当更新现有文档。
一行数据对应一个文档
{
service_id:555
timestamp:1265248762
in:584
out:11342
}
{
service_id:555
timestamp:1265249062
in:94
out:1242
}
每月新增约1500万个文档。所有数据都将插入新文档中。插入速度较快,但我对亿万级文档在一年或两年后的效率有疑问。文件IO似乎是一个难以克服的问题(虽然我承认我并不完全理解其中的机制)。
我试图用面向文档的方式来处理这个问题,但打破关系型数据库的惯例确实有些困难。事实上,你只能最小限度地将视图参数化,这让我有点担心。话虽如此,上述哪种方法最合适呢?还有其他我没有考虑到的格式可以更好地发挥作用吗?
提前感谢,
杰米。