У меня есть коллекция с составным индексом по четырем полям по порядку: (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
на несколькозапросы с равными, чтобы сделать курсора меньше сканирования документов?Что будет эффективнее в случае миллионов документов в коллекции?