Приветствую. Вводные данные:
- коллекция примерно на 11.5млн записей
- в каждом документе есть поле строкового формата, в котором может или строка, или пустое значение
- в каждом документе есть числовое поле от 0 до 100, которое используется в сортировках
Запрос 1 (1.74 сек) = 5971171:
db.getCollection('channels').find(
{ 'update': { $gt: '' }}
).count();
Запрос 2 (1.74 сек) = 5697946:
db.getCollection('channels').find(
{ 'update': { $eq: '' }}
).count();
Относительно близкие результаты, т.е. вся коллекция по сути поделена примерно пополам - пустое/непустое значения. Дальше я хочу выбрать документы с максимальным индексом сортировки из этих двух групп:
Запрос по "не пустое" (0.005 сек):
db.getCollection('channels').find(
{ 'update': { $gt: '' }}
).sort(
{ 'sort': -1 }
).limit(1);
Запрос по "пустое" (12.4 сек):
db.getCollection('channels').find(
{ 'update': { $eq: '' }}
).sort(
{ 'sort': -1 }
).limit(1);
Индексы:
_sort_ {
"sort" : -1
}
_update_ {
"update" : 1
}
В чем причина такой разницы времени выполнения? Особенно если учесть, что индекс по полю "update" - возрастающий, а пустые значения "" должны бы быть в начале индекса, а значит гораздо быстрее выбраться...