MongoDB $ в операторе и составном индексе - PullRequest
5 голосов
/ 04 марта 2012

У меня есть коллекция с составным индексом по четырем полям по порядку: (A, B, C, D)

Когда я делаю запрос как

find({A: val1, B: val2, C: val3}).sort({D: 1}).limit(N)

со строгими равенствами в поляхA, B, C он работает очень быстро, как и должно быть.И explain() говорит мне, что было отсканировано только N документов.

Если я изменяю один из операторов равенства на $in (с массивом около 100 элементов), он сканирует гораздо большее количество документов и работает медленнее:

find({A: {$in: [val0, val1, ...]}, B: val2, C: val3}).sort({D: 1}).limit(N)

Другие операторы, такие как $or, имеют тот же эффект.

Логически один $in с 100 элементами должен быть очень похож на 100 отдельных запросов со строгими равными.Второй вариант работает намного быстрее в базе данных, но требует получения всех элементов (без ограничений) с последующей сортировкой и ограничением на стороне клиента.

Имеет ли смысл разделить этот один запрос с $in на несколькозапросы с равными, чтобы сделать курсора меньше сканирования документов?Что будет эффективнее в случае миллионов документов в коллекции?

1 Ответ

2 голосов
/ 05 марта 2012

Вы тестировали с индексом {B: 1, C: 1, A: 1, D: 1}?Таким образом, точные значения B и C могут быть обработаны быстро, диапазон может быть использован в поле A, а сортировка по D все еще может выполняться через индекс.

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