Задать вопрос
@zuart
... уже и не знаю, нуп, похоже ...

Как понять причину поведения выборки в MongoDB?

Приветствую. Вводные данные:
- коллекция примерно на 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" - возрастающий, а пустые значения "" должны бы быть в начале индекса, а значит гораздо быстрее выбраться...
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Запишите -1 там, где нет значения.
Используйте {update: -1} для поиска "пустых" строк.
Что говорит explain?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы