【问题标题】:index usage in mongodb when index key is repetitive索引键重复时mongodb中的索引使用情况
【发布时间】:2017-12-07 11:04:35
【问题描述】:

我有一个具有重复价值的集合,如下所示

{ "_id" : ObjectId("59f42f500790826aae869517"), "student_id" : 1, "type" : "exam", "score" : 38.09994424551998 }
{ "_id" : ObjectId("59f42f500790826aae869518"), "student_id" : 1, "type" : "homework", "score" : 91.98453327244025 }
{ "_id" : ObjectId("59f42f500790826aae869519"), "student_id" : 1, "type" : "quiz", "score" : 51.50397276737756 }

现在我已将 'student_id' 作为索引,并且有索引与

'student_id,type' , 'student_id,score' & 'student_id,type,score'

。 当我对此进行以下查询时

db.scores.explain("executionStats").find({'student_id':{$gte:10}},{_id:0,type:0,score:0})

我希望应该只使用“student_id”索引,因为所有其他字段都投影为 0,所以我不需要它们。但是它告诉我使用的索引是 'student_id,type'。一个猜测我可以认为mongodb会扫描每个文档以查找特定的student_id以了解文档差异,最好的方法是使用“student_id,type”索引。但是我可能是错的。所以请帮我知道原因。谢谢。

【问题讨论】:

  • 创建索引的顺序重要吗?之后我创建了 student_id。如果是这样,我还需要使用 $hint 吗?

标签: mongodb mongodb-query


【解决方案1】:

我刚刚对您的场景进行了实验,可以确认索引创建的顺序似乎是这里的关键。

对此的解释可能是查询优化器只是寻找一个涵盖所需字段的索引(在您的情况下只有student_id)。所以这个“找到正确的”索引算法会按照创建的顺序遍历可用索引的列表。由于它遇到的第一个索引(除了_id 字段上的默认索引...)已经适合您的查询,因此优化器决定使用它并且不再费心查找。

indexes 上的文档指出:

MongoDB 索引使用 B-tree 数据结构。

对于compound indexes

复合索引中列出的字段顺序很重要。为了 例如,如果复合索引由 { userid: 1, score: -1 } 组成, 索引首先按用户 ID 排序,然后在每个用户 ID 值内, 按分数排序。

因此,由于您的所有索引都将student_id 作为其第一个字段,因此所有索引在树的顶部(“根目录的正下方”)看起来都是相同的,并且同样可以很好地为您的查询提供服务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    • 2020-09-29
    • 2018-01-19
    相关资源
    最近更新 更多