Mongodb 具有动态匹配条件查询的索引策略
我有一个集合,它将保存机器数据和移动数据,数据在通道上捕获,并在单个级别进行维护,无需嵌入对象,结构如下Mongodb 具有动态匹配条件查询的索引策略,mongodb,indexing,aggregation-framework,Mongodb,Indexing,Aggregation Framework,我有一个集合,它将保存机器数据和移动数据,数据在通道上捕获,并在单个级别进行维护,无需嵌入对象,结构如下 { "Id": ObjectId("544e4b0ae4b039d388a2ae3a"), "DeviceTypeId":"DeviceType1", "DeviceTypeParentId":"Parent1", "DeviceId":"D1", "ChannelName": "Login", "Timestamp": ISODate("20
{
"Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
"DeviceTypeId":"DeviceType1",
"DeviceTypeParentId":"Parent1",
"DeviceId":"D1",
"ChannelName": "Login",
"Timestamp": ISODate("2013-07-23T19:44:09Z"),
"Country": "India",
"Region": "Maharashtra",
"City": "Nasik",
"Latitude": 13.22,
"Longitude": 56.32,
//and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceType" : 1,
"Timestamp" : 1
},
"name" : "DeviceType_1_Timestamp_1",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceTypeParentId" : 1,
"Timestamp" : 1
},
"name" : "DeviceTypeParentId_1_Timestamp_1",
"ns" : "DB.channel_data"
}
]
大多数查询都是聚合查询,用于分析仪表板和实时分析,$match管道如下
{
"Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
"DeviceTypeId":"DeviceType1",
"DeviceTypeParentId":"Parent1",
"DeviceId":"D1",
"ChannelName": "Login",
"Timestamp": ISODate("2013-07-23T19:44:09Z"),
"Country": "India",
"Region": "Maharashtra",
"City": "Nasik",
"Latitude": 13.22,
"Longitude": 56.32,
//and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceType" : 1,
"Timestamp" : 1
},
"name" : "DeviceType_1_Timestamp_1",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceTypeParentId" : 1,
"Timestamp" : 1
},
"name" : "DeviceTypeParentId_1_Timestamp_1",
"ns" : "DB.channel_data"
}
]
或
我的许多DAL层find查询和findOne查询大多基于标准DeviceType或DeviceTypeParentId
这个集合是巨大的,并且不断增长,我使用了复合索引来支持这个查询,索引如下
{
"Id": ObjectId("544e4b0ae4b039d388a2ae3a"),
"DeviceTypeId":"DeviceType1",
"DeviceTypeParentId":"Parent1",
"DeviceId":"D1",
"ChannelName": "Login",
"Timestamp": ISODate("2013-07-23T19:44:09Z"),
"Country": "India",
"Region": "Maharashtra",
"City": "Nasik",
"Latitude": 13.22,
"Longitude": 56.32,
//and more 10 - 15 fields
}
{$match:{"DeviceTypeId":{"$in":["DeviceType1"]},"Timestamp":{"$gte":ISODate("2013-07-23T00:00:00Z"),"$lt":ISODate("2013-08-23T00:00:00Z")}}}
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceType" : 1,
"Timestamp" : 1
},
"name" : "DeviceType_1_Timestamp_1",
"ns" : "DB.channel_data"
},
{
"v" : 1,
"key" : {
"DeviceTypeParentId" : 1,
"Timestamp" : 1
},
"name" : "DeviceTypeParentId_1_Timestamp_1",
"ns" : "DB.channel_data"
}
]
现在,我们将在DeviceId上添加对匹配标准的支持,如果我采用与DeviceType相同的策略,并且DeviceTypeParentId不好,因为我用我目前的方法,我正在创建许多索引,而且大多数索引都是相同和巨大的。
因此,它们的索引是否有任何好的方法。我读过一些关于索引交叉点的文章,但不确定它会有什么帮助
如果我采用了任何错误的方法,请指出,因为这是我的第一个项目,也是我第一次使用MongoDB。这些索引看起来都适合您的查询,包括您建议的新索引。就快速查询而言,支持三种查询的三个单独索引是总体上最好的选择。您可以在每个字段上放置索引,并让计划者使用索引交集,但它不如复合索引好。索引不同,因为它们支持不同的查询 我认为真正的问题是,索引的(显然)大内存占用在这一点上实际上是一个问题吗?由于分页索引和磁盘外的数据,您是否有很多页面错误?可能有用