复合索引如何在 mongodb 中工作?

Posted

技术标签:

【中文标题】复合索引如何在 mongodb 中工作?【英文标题】:How compound indexes work in mongodb? 【发布时间】:2019-01-01 23:15:43 【问题描述】:

我正在使用 pymongo 和 mongoengine,下面是集合架构。

class Person(Document, BaseMixin):
    school_id = StringField(required = True)
    first_name = StringField(default="")
    last_name = StringField(default="")
    email = StringField(default="")
    creation_time = DateTimeField(default = datetime.utcnow())
    user_status = StringField(default='active') # possible values, 'active', 'blocked', 'deleted'
    meta = 
        'indexes': [('school_id', 'first_name'), ('school_id', 'user_status', 'first_name'),
                    ('school_id', 'user_status', 'creation_time'), ('school_id', 'creation_time')],
        'index_background': True
    

我想获取特定日期范围内的活跃用户和屏蔽用户列表,并按名字搜索活跃用户和屏蔽用户。 我正在浏览有关索引的 mongo 文档,发现该文档说明最好将状态索引归档mongo docs

我创建了上述索引来测试 mongo 在处理查询时选择了哪个索引。该集合包含多所学校的数据,因此在 school_id 上添加了索引。 第一个查询:使用的索引 = school_id_1_user_status_1_first_name_1

Person.objects(school_id = 'test', user_status__in = ['active', 'blocked'], first_name = 'test_name')

第二次查询:使用的索引 = school_id_1_creation_time_1

Person.objects(school_id = 'test', user_status__in = ['active', 'blocked'], creation_time__gte = datetime(2018, 7, 1))

所以我不确定在这种情况下如何使用索引?,任何人都可以提供有关它的更多信息。 另外,如果我的索引方案或集合模式有问题,请建议我。 谢谢。

【问题讨论】:

【参考方案1】:

您实际上拥有您并不真正需要的索引。 您可以将索引减少到:

 'indexes': [('school_id', 'first_name', 'user_status'),('school_id',
 'creation_time','user_status')]

这是因为查询的字段顺序不是必需的,只是该字段存在于查询中。因此,即使索引具有三个字段,查询也只能使用其中两个字段。规则是索引的第一个字段必须在查询中,以便查询可以使用该索引。

【讨论】:

嗨@jjussi,我添加了这些索引只是为了分析mongo查询使用哪个索引。我不确定复合索引在 mongo 中是如何工作的。根据您的解释,当 ('school_id', 'creation_time','user_status') 和 ('school_id', 'creation_time') 索引都存在时,给定查询应该使用 3 字段索引?但它使用的是 2 个字段索引。所以添加 ('school_id', 'creation_time','user_status') 不会有用吗?所以请解释一下复合索引树是如何构建和搜索的。

以上是关于复合索引如何在 mongodb 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB ODM 索引:如何在本身具有 EmbeddedDocument 的文档上索引多个复合索引?

我应该如何构建我的 MongoDB 复合索引?

MongoDB——索引类型之复合索引(Compound Index)

MongoDB——索引类型之复合索引(Compound Index)

MongoDB 复合索引到 Kibana elasticsearch

MongoDB复合索引详解