Pull to refresh

Comments 12

Хотя как написано в документации запросы с $or должны выполняться параллельно…
Здесь необходимо добавить уточнение: mongodb может использовать только один индекс для каждой операции, но в случае с $or, для каждой составляющей может быть использован отдельный индекс:
MongoDB can only use one index to support any given operation. However, each clause of an $or query may use a different index.
Мне всегда казалось, что для каждого элемента $or монго делает отдельный запрос, но если есть индексы, она должна их использовать, в вашем случае индекса должно быть 2 — на i и j, вы случайно не использовали копозитный индекс из i + j? Если это так, то индекс не будет задействован для $or.
Спасибо за совет. Сделал два индекса по i и j отдельно. Стало работать быстрее. Вместо 2 секунд стало 0.2 на данном тесте.
Но $in все равно быстрее и выдает результат за 0.006 — 0.01 секунд (т.е. примерно раз в 50 быстрее).
А не могли бы провести такие же тесты на 2.6? Я изучал недавно примерно такую же проблему, в 2.6 все было пошустрее с $or.
Проверил на 2.6
Действительно, исходный вариант там работает значительно быстрее! А именно за 0.07 секунды. Но в тоже время вариант с индексом вида i_j все равно за 0.006 — 0.01 секунд (т.е. примерно раз в 10 быстрее)
Разница понятна, вы еще ищите по разным индексам. Предполагаю, что $in и $or по полю `i_j` должны давать один и тот же результат.
Ой какая странная монга :) $or по полю ij дает значительно хуже результат, чем $in по тому же самому полю: 0.35 — 0.40 (против 0.006 — 0.01 секунд)

Ничего странного, разные операции работают по разному за разное время.
Как выше написали $or — выполняет параллельно несколько запросов, а $in делает выборку за один проход (при правильном индексе).
$or может выбирать по разным условиям, $in работает по одному атрибуту.
Разные операции, разные задачи.
Раз я не знаю как сделать $in по двум полям, то введем искусственное поле следующим образом (слепим значения i и j через подчеркивание '_'):

По идее можно попробовать поместить атрибуты в словарь { d:{ i:0, j:0 } }, и сделать поэтому словарю индекс.
Sign up to leave a comment.

Articles