我对1个对象的数据大小有疑问。我不知道我的数据模型是真的吗? 这是情况: 我有25台服务器,200台服务器计数器,以及1440分钟的数据。 我的目的是保存服务器计数器的日常数据。 但查询性能对我来说很重要。
我的数据模型:
{ "_id":Object(....),
"serverId":0
"counters": [
{ "counterId":0 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "counterId":0
.
{ "counterId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "counterId":1
.
.
. 200 Counters
.
{ "counterId":200 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}
.
.1440 times "counterId":200
.
] },
.
.
.25 Server
.
.
{ "_id":Object(....),
"serverId":25
"counters": [
{ "counterId":0 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "counterId":0
.
{ "counterId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "counterId":1
.
.
. 200 Counters
.
{ "counterId":200 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}
.
.1440 times "counterId":200
.
] },
问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要12秒 ---数据大小---- 当我尝试时,不可能像16 Mb那样建模。
我的数据模型:
{ "_id":Object(....),
"counterId":0
"servers": [
{ "serverId":0, "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "serverId":0
.
{ "serverId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "serverId":1
.
.
. 25 Server
.
{ "serverId":25 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}
.
.1440 times "serverId":200
.
] },
.
.
.200 Counter
.
.
{ "_id":Object(....),
"counterId":200
"servers": [
{ "serverId":0, "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "serverId":0
.
{ "serverId":1 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333} ,
.
.1440 times "serverId":1
.
.
. 25 Server
.
{ "serverId":25 , "inserted": ISODate(...) , "counterValue":122.2131 , "min":121 , "max":33333}
.
.1440 times "serverId":200
.
] },
问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要7秒 ---数据大小---- 当我尝试时,不可能像16 Mb那样进行建模。但是我将它分成2件作品。
我的数据模型:
{ "_id" : ObjectId("515921e3bbea58d25eb07b22"), "serverId" : 0, "counterId" : 0, "inserted" : ISODate("2013-03-21T00:26:30Z"), "counterValue" : 0.03256159112788737, "min" : -29.967438408872113, "max" : 20.032561591127887 }
.
.7 billion data
.
问题: ----对灌溉框架的表现 - : 当我试图在1天内找到计数器的平均值时,需要7秒
SO: 我无法决定必须使用哪种数据模型,
谢谢..
答案 0 :(得分:1)
不知道你为什么选择monogodb。 我会使用你的第三个选项,但缺乏索引。为serverid和counterid字段添加索引,你会得到更好的时间。
此外,您最终可能会有单独的读写集合,即
- 使用第三个选项中的一个集合 - 一次和每小时/每天/每周(很可能是一天)运行查询以获取聚合数据并将其放入另一个集合中,也使用索引,您将从no查询。 之后,如果您不再需要,您将删除已收集的数据。
在你的情况下,它将是
db.events.ensureIndex({counterId:1,serverId:2, datetime:3 })
您可以在索引中播放字段序列,因为它可能会导致不同的结果。
另外,如果你按照我说的那样每小时聚合一次,你最好将datetime作为第一个索引字段
db.events.ensureIndex({datetime:1, counterId:2,serverId:3 })
注意:显然添加索引会提高从集合中读取数据的速度,但会减慢向其写入数据的速度。