Mongodb索引建议
第一次使用mongodb时,我需要索引建议方面的帮助。在我的mongo数据库中,我收集了近1500万个文档。附件是json文档。“playfields”是嵌入文档的数组。我经常运行以下查询。值字段中的数据存储在不同的数据类型(字符串、int)中。我的问题是,为了涵盖以下查询,在此文档上添加的最佳索引是什么:Mongodb索引建议,mongodb,indexing,mongodb-query,Mongodb,Indexing,Mongodb Query,第一次使用mongodb时,我需要索引建议方面的帮助。在我的mongo数据库中,我收集了近1500万个文档。附件是json文档。“playfields”是嵌入文档的数组。我经常运行以下查询。值字段中的数据存储在不同的数据类型(字符串、int)中。我的问题是,为了涵盖以下查询,在此文档上添加的最佳索引是什么: db.playfieldvalues.find({"playfields":{$elemMatch:{ID:"Play.NHL.NHLEventX", value: -47}}}) 示例J
db.playfieldvalues.find({"playfields":{$elemMatch:{ID:"Play.NHL.NHLEventX", value: -47}}})
示例JSON文档:
{
"Playid": "9dbc7763-7d47-44e9-8b11-e1ec864407bb",
"Playfields": [
{
"ID": "XInfo_OffTeam",
"Value": "Dallas",
"TS": "201709291148408452"
},
{
"ID": "XInfo_DefTeam",
"Value": "Kansas",
"TS": "201709291148456267"
},
{
"ID": "XInfo_Period",
"Value": 1,
"TS": "201709291148456267"
},
{
"ID": "XInfo_OffScore",
"Value": 38,
"TS": "201709291148456267"
},
{
"ID": "XInfo_DefScore",
"Value": 21,
"TS": "201709291148456267"
},
{
"ID": "XInfo_PlayAction",
"Value": "Y",
"TS": "201709291148456267"
}
]
}
如果您对
游戏场的查询总是使用$elemMatch
操作符来处理ID
和Value
的配对,然后在Playfields.ID
上创建一个复合索引,游戏场。Value
听起来很合理:
db.collection.ensureIndex({ "Playfields.ID": 1, "Playfields.Value": 1 })
但是。。。任何指数的创建都应该伴随一些实证检验。使用explain()
运行您的查询,以了解您的索引是否实际被选中,如果是,它的选择性有多高:
db.playfieldvalues.find({ "playfields": { $elemMatch: { ID: "Play.NHL.NHLEventX", Value: -47 } } })
.explain()
“解释文件”的内容有很多细节,但首先要检查的是:
- 选择了什么索引(如果有的话)
- 检查的钥匙数量
- 检查的文档数
粗略地说,“检查的关键点”越接近返回的文档数量,索引覆盖率就越高
如果MongoDB没有选择您的索引,那么您应该查看解释计划提供的关于被拒绝计划的详细信息,以及拒绝计划的原因
还有一个问题是索引的成本(就对写入时间和索引存储的影响而言),因此我建议考虑您的非功能性需求—在没有专用索引的情况下,是否可以实现所需的运行时间?如果没有,那么您应该继续进行实证测试,但要准备根据explain()
输出告诉您的内容调整您的选择。对于某些查询,milti-key复合索引看起来工作正常。添加索引后,db.collection.ensureIndex({“Playfields.ID”:1,“Playfields.Value”:1})以下查询运行得更快:db.playfieldvalues.find({Playfields:{$elemMatch:{ID:{ID:{Play.NHL.NHLEventX,Value:58}}}])以下带有逻辑运算符的查询运行得非常慢:db.playfieldvalues.find({$and:[{{Playfields:{$elemMatch ID:“Play.NHL.NHLEventY”,value:-38}},{playfields:{$elemMatch:{ID:“Play.NHL.NHLEventX”,value:58}}}}}}]})的确……您应该继续进行实证测试,但要准备根据explain()输出告诉您的内容调整您的选择。