Как составные индексы работают в mongodb?

Я использую 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
    }

Я хочу получить список активных и заблокированных пользователей для определенного диапазона дат и выполнить поиск активных и заблокированных пользователей по их имени. Я просматривал документы по монго об индексах и обнаружил, что в этом документе лучше указывать индексы в документах о состоянии монго.

Я создал вышеупомянутые индексы, чтобы проверить, какой индекс выбирает монго при обработке запросов. Сборник содержит данные для нескольких школ, поэтому добавлен индекс по 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')]

Это из-за порядка полей запроса не является существенным, просто это поле существует в запросе. Таким образом, даже если индекс имеет три поля, запрос может использовать только два из этих первых полей. Правило состоит в том, что первое поле индекса ДОЛЖНО быть в запросе, чтобы запрос мог использовать этот индекс.

Другие вопросы по тегам