【问题标题】:Mongoose indexes at both field and schema levels字段和模式级别的猫鼬索引
【发布时间】:2015-05-23 06:23:46
【问题描述】:

我了解,如果实施得当,索引可以成为快速检索数据的宝贵工具。我希望能够扫描我的文档以查找某个字段值字段值的组合。

我将索引两个字段(类别、标签)。类别是一个字符串,标签是一个数组。我需要能够查询特定类别中的项目和/或包含特定标签的项目。

这里是三个例子:

  1. 显示类别中的所有文档:“汽车”
  2. 显示所有包含标签的文档:“electric”
  3. 显示“汽车”类别中包含“电动”标签的所有文档

两个字段的架构级索引是否足以满足所有三种情况?

docSchema.index({category:1, tags:1});

或者我是否还需要在字段级别定义它们,以支持我只搜索单个字段时的场景?

docSchema = mongoose.Schema({
    category: {
        type: String,
        index: true
    },
    tags: {
        type: [String],
        index: true
    }
});

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    docSchema.index({category:1, tags:1}); 是一个复合索引。

    此复合索引支持场景 1 和 3:

    -> 显示类别中的所有文档:“汽车”

    -> 显示“汽车”类别中包含“电动”标签的所有文档

    为了支持方案 2,您需要在 tag 字段上定义一个附加单一索引。 docSchema.index({tags:1});

    复合索引支持涉及复合索引中所有字段的查询以及涉及复合索引的前缀的查询。在这种情况下,您的复合索引支持同时涉及 categories 和 tags 的查询以及仅涉及 categories 的查询。

    为了更好地理解逻辑,请查看 MongoDB 文档站点上的 Compound Indexes 文章。请特别注意讨论前缀的部分。

    【讨论】:

      【解决方案2】:

      您需要single field index 上的categorymultikey index 上的tags。您可能很想使用复合索引而不是其中之一。但是,如果您使用的是 MongoDB >= 2.6,则它不是强制性的,因为它有一个很好的特性,称为 index intersection

      1. 显示类别中的所有文档:“汽车”
      2. 显示所有包含标签的文档:“electric”
      3. 显示“汽车”类别中包含“电动”标签的所有文档

      (1) 将使用category 上的索引(包括任何以category 为前缀的索引) (2) 将使用tags 上的索引(包括任何以tags 为前缀的索引) (3) 将使用tags上的索引category上的索引它们两者的索引交集(取决于查询计划器的选择)。

      作为参考,有一个很好的discussion about index intersection in the MongoDB blog。值得阅读整篇文章。但是引用结论,主要是比较索引交集和复合索引:

      需要明确的是,如果您知道要查询的内容并且可以提前创建一个,那么复合索引将始终 [比索引交集] 更高效。此外,如果您的工作集完全在内存中,那么您将不会获得 Index Intersection 的任何好处,因为它主要基于减少 IO。但在更特殊的情况下,即无法预测查询的形状并且工作集远大于可用内存,索引交集将自动接管并选择性能最高的路径。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 2021-04-01
        • 2015-04-11
        • 2014-06-22
        • 2023-04-07
        相关资源
        最近更新 更多