MongoDB - Поиск в массивах так же быстр, как поиск в простых ключах? - PullRequest
6 голосов
/ 10 августа 2011

Скажем, у меня следующий дизайн:

id | participant_ids
...| [ObjectId(...), ObjectId(...)]

Теперь я запрашиваю его следующим образом:

db.events.find({
    participant_ids: ObjectId(...)
});

Что идентично этому:

db.events.find({
    participant_ids: {
        $in: ObjectId(...)
    }
});

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


Для каждого события есть как минимум 1 и максимум 2участников.Поэтому я мог бы также использовать следующий дизайн:

id | participant_1_id | participant_2_id

... и запросить его следующим образом ...:

db.events.find({
    $or: {
        participant_1_id: ObjectId(...),
        participant_2_id: ObjectId(...)
    }
});

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

Для первого дизайна я бы пошел со следующим индексом:

db.events.ensureIndex({
    participant_ids: 1
});

Для второгоВо-первых, я пойду с этим:

db.events.ensureIndex({
    participant_1_id: 1,
    participant_2_id: 1
});

У обоих есть недостатки, когда вы смотрите на их производительность.

  • 1-й запрос: ИспользованиеArray, вероятно, медленнее, чем использование простого ключа.
  • 2-й запрос: Использование оператора $or не очень быстрое.
  • 2-й запрос: Не очень масштабируемый, скажем, я бы хотел когда-нибудь освободить лимит участников, это было бы невозможно (у вас было бы неограниченное количество ключей и неограниченное количество элементов в $or частивопросы).

Мои вопросы: - Какой дизайн я должен использовать?- Могу ли я индексировать Array с?Документы ничего не говорят об этом, и я не уверен, что Array s (поскольку их содержание может сильно отличаться).

1 Ответ

5 голосов
/ 10 августа 2011

1-й запрос: использование массива, вероятно, медленнее, чем использование простого ключа.

Я так не думаю. Это должен быть точно такой же путь доступа на основе индекса, если у вас есть одно значение («простой ключ») или несколько («массив»).

participant_1_id, participant_2_id просто ужасно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...