Mongodb指数建议

时间:2017-10-11 20:15:58

标签: mongodb indexing mongodb-query

我第一次使用mongodb,我需要索引建议的帮助。在我的mongo数据库中,我收集了近1500万个文档。附件是json文档。 “playfields”是一系列嵌入式文档。我经常运行以下查询。值字段中的数据以不同的数据类型(字符串,整数)存储。我的问题是在这些文档中添加的最佳索引是什么,以涵盖以下查询:

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"
    }
  ]
}

enter image description here

1 个答案:

答案 0 :(得分:2)

如果您Playfields上的查询始终使用$elemMatch运算符来解决IDValue的配对问题,那么就会在Playfields.ID上创建综合索引,{ {1}}听起来很明智:

Playfields.Value

但是......任何索引创建都应该伴随着一些经验测试。使用db.collection.ensureIndex({ "Playfields.ID": 1, "Playfields.Value": 1 }) 运行您的查询,以了解您的索引是否实际被选中,如果是,那么它的选择性如何:

explain()

关于'解释文档的内容有很多详细信息in the docs。但首先要检查的是:

  • 选择了什么索引(如果有的话)
  • 检查的密钥数
  • 审核的文档数

粗略地说,检查了更近的钥匙'对于返回的文档数量,您获得的索引覆盖率越高。

如果MongoDB尚未选择您的索引,那么您应该查看解释计划提供的有关被拒绝计划的详细信息以及被拒绝的原因。

还有一个问题是索引的成本(就写入时间和索引存储的影响而言),因此我建议考虑您的非功能性要求 - 如果没有专用索引,您可以实现所需的经过时间吗? ?如果没有,那么你应该进行实证测试,但要准备好根据db.playfieldvalues.find({ "playfields": { $elemMatch: { ID: "Play.NHL.NHLEventX", Value: -47 } } }) .explain() 输出告诉你的内容来调整你的选择。