MongoDb数据库建模
我对1对象的数据大小有问题。我不知道我的数据模型是真的吗? 情况如下: 我有25个服务器,200个服务器计数器和1440分钟的数据。 我的目的是保存服务器计数器的日常数据。 但是查询性能对我来说很重要 我脑海中有3个模型,但我不知道哪一个更适合我的项目。 1-服务器根目录: 我的数据模型:MongoDb数据库建模,mongodb,Mongodb,我对1对象的数据大小有问题。我不知道我的数据模型是真的吗? 情况如下: 我有25个服务器,200个服务器计数器和1440分钟的数据。 我的目的是保存服务器计数器的日常数据。 但是查询性能对我来说很重要 我脑海中有3个模型,但我不知道哪一个更适合我的项目。 1-服务器根目录: 我的数据模型: { "_id":Object(....), "serverId":0 "counters": [ { "counterId":0 , "inser
{ "_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
.
] },
{ "_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
.
] },
{ "_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天的平均计数器值时,需要12秒
---数据大小----
这是不可能的建模像16 Mb时,我尝试满了
2-计数器根: 我的数据模型:
{ "_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
.
] },
{ "_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
.
] },
{ "_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
.
问题:
----聚合框架的查询性能--:
当我试图找到一天计数器的平均计数器值时,需要7秒
---数据大小----
这是不可能的建模像16 Mb时,我尝试,但我分为两个作品,它的作品
3-无根: 我的数据模型:
{ "_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
.
] },
{ "_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
.
] },
{ "_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
.
问题:
----聚合框架的查询性能--:
当我试图找到一天计数器的平均计数器值时,需要7秒
因此:
我无法决定必须使用哪种数据模型
谢谢。我不知道你为什么在这里选择monogodb。 我会使用你的第三个选项,但是没有索引。为serverid和counterid字段添加索引,您将获得更好的时间 此外,你可能会有单独的集合用于读写,即 -像在第三个选项中一样使用一个集合 -一次和一小时/天/周(最有可能是一天)运行查询以获取聚合数据,并将其放入另一个集合中,还包括索引,您将从“否”开始进行查询。 之后,如果不再需要,您将删除已删除的数据 这是和 你的情况是
db.events.ensureIndex({counterId:1,serverId:2, datetime:3 })
您可以使用索引中的字段序列,因为它可能导致不同的结果
另外,如果您要像我说的那样每小时聚合一次,那么最好将datetime作为第一个索引字段
db.events.ensureIndex({datetime:1, counterId:2,serverId:3 })
注:添加索引显然会提高从采集中读取数据的速度,但会减慢向其中写入数据的速度。因为我在其中使用MongoDb,一天有700万数据,我们希望显示一年的数据,所以我们有非常大的数据量。为了减少数据大小,我们决定使用mongodb。您使用mongodb减少数据大小的确切含义是什么?使用nosql db无论如何都不会减少数据量。它只是为您提供了不同的api,用于将数据读/写到存储器中。此外,如果您打算将数据存储一年,那么为所有可用时间段预聚合数据肯定是有意义的,即为年、月、周等创建单独的集合。MongoDB使用BSON存储数据。它还为其他数据库系统提供了许多轻量级数据。这是真的吗?坦白说,这是我在选择数据库引擎时最不愿意考虑的事情。我从来没有比较过mongo db和sql db存储相同数量的相似数据,但考虑到你们的规模,我不相信它们之间的差异不会如此巨大