Comments 12
Хотя как написано в документации запросы с $or должны выполняться параллельно…
А что говорит explain()? Попробуйте два отдельных индекса по i и j?
В пост добавил explain
Здесь необходимо добавить уточнение: 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.
А не могли бы провести такие же тесты на 2.6? Я изучал недавно примерно такую же проблему, в 2.6 все было пошустрее с $or.
Проверил на 2.6
Действительно, исходный вариант там работает значительно быстрее! А именно за 0.07 секунды. Но в тоже время вариант с индексом вида i_j все равно за 0.006 — 0.01 секунд (т.е. примерно раз в 10 быстрее)
Действительно, исходный вариант там работает значительно быстрее! А именно за 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 работает по одному атрибуту.
Разные операции, разные задачи.
Как выше написали $or — выполняет параллельно несколько запросов, а $in делает выборку за один проход (при правильном индексе).
$or может выбирать по разным условиям, $in работает по одному атрибуту.
Разные операции, разные задачи.
Раз я не знаю как сделать $in по двум полям, то введем искусственное поле следующим образом (слепим значения i и j через подчеркивание '_'):
По идее можно попробовать поместить атрибуты в словарь { d:{ i:0, j:0 } }, и сделать поэтому словарю индекс.
Sign up to leave a comment.
MongoDB: $or VS $in — что работает быстрее?