0

我对 1 个对象的数据大小有疑问。而且我不知道我的数据模型是真的吗?情况如下:我有 25 个服务器、200 个服务器计数器和 1440 分钟数据。我的目的是保存服务器计数器的每日数据。但是查询性能对我来说很重要。

我脑子里有 3 个模型,但我不知道哪一个更适合我的项目。

1-服务器根:

我的数据模型:

{ "_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 那样建模我尝试时吃饱了。


2-计数器根:

我的数据模型:

 { "_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 块。


3-没有根:

我的数据模型:

{ "_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:我无法决定必须使用哪种数据模型,

谢谢..

4

1 回答 1

1

不知道你为什么在这里选择 monogodb。我会使用您的第三个选项,但缺少索引。为 serverid 和 counterid 字段添加索引,您将获得更好的时间。

此外,您可能最终拥有单独的读写集合,即

- 像在第三个选项中一样使用一个集合 - 一次和小时/天/周(很可能是一天)运行查询以获取聚合数据并将其放入另一个集合中,也包含索引,您将从一开始就查询. 之后,如果您不再需要汇总数据,您将删除它。

这是关于索引和常见问题的帮助页面

在你的情况下,它将是

 db.events.ensureIndex({counterId:1,serverId:2, datetime:3 })

您可以使用索引中的字段序列,因为它可能会导致不同的结果。

另外,如果您要按照我所说的每小时聚合一次,则最好将 datetime 作为第一个索引字段

 db.events.ensureIndex({datetime:1, counterId:2,serverId:3 })

注意:显然添加索引会提高从集合中读取数据的速度,但会减慢向其写入数据的速度。

于 2013-04-01T08:19:31.043 回答