【问题标题】:Moving MongoDB to Multikeys but indexOnly is returning false将 MongoDB 移动到 Multikeys 但 indexOnly 返回 false
【发布时间】:2014-03-13 03:50:10
【问题描述】:

我正在尝试做的事情对我来说听起来合乎逻辑,但我不确定。

我正在尝试使用 Multikeys 改进 MongoDB 集合的一部分。

例如:我有多个格式如下的文档:

文档:

{
   "_id": ObjectId("528a4177dbcfd00000000013"),
   "name": "Shopping",
   "tags": [
     "retail",
     "shop",
     "shopping",
     "store",
     "grocery" 
  ] 
}


查询:
到目前为止,我一直在使用以下查询来匹配 tags 字段。

var tags = Array("store", "shopping", "etc");
db.collection.findOne({ 'tags': { $in: tags } }, { name: true });

这一直运作良好,但是我认为在这种情况下应该使用 Multikeys 来提高速度和性能。如果我错了,请纠正我!


索引:
我发出以下命令试图索引tags

db.collection.ensureIndex( { tags: 1 }, { safe: true }, function(err, doc) {} );

ensureIndex 成功。


结果:
但是,在上述查询中使用 RockMongo 的 explain 功能时,结果是:

{
   "indexOnly": false,
   "indexBounds": {
     "tags": [
       [
         "etc",
         "etc" 
      ],
       [
         "shopping",
         "shopping" 
      ],
       [
         "store",
         "store" 
      ] 
    ] 
  }
}


问题:

  1. 为什么索引不起作用,我还有什么需要做的吗?
  2. 在这种情况下多键索引是否有益? (我假设是的。
  3. 还有其他更有益的索引形式吗?



编辑:
我刚刚注意到在 RockMongo explain 数据中有一个字段: "isMultiKey": true,
会不会是 Multikeys 正在被使用,而我完全误解了它正在被索引?

【问题讨论】:

    标签: mongodb indexing mongojs multikey


    【解决方案1】:

    正如您在编辑中所说,来自您未发布的说明部分是 isMulyiKey: true 以及光标上的其他信息显示正在使用索引。 indexBounds 是另一个指标。

    indexOnly 描述的是,您的查询包含另一个字段 name,它不是索引的一部分。当查询优化器发现查询的所有元素都可以通过使用索引中的字段来满足时,这被称为covered query,并且这里的indexOnly 属性设置为true。

    因此,在理想情况下,您的查询和结果仅使用索引中的信息,而 MongoDB 也必须查找集合中索引中的条目,以便返回更多数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-28
      • 2021-06-15
      • 2012-06-29
      • 2013-02-26
      相关资源
      最近更新 更多