Медленный запрос MongoDB в верхней части индекса - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть коллекция в MongoDB с 1,7 миллионами документов размером в 6 КБ в среднем на каждый документ. База данных находится на разумной машине, с 6 ГБ ОЗУ и 4 ядрами

Эта коллекция имеет индекс для поддержки моих запросов. Этот индекс имеет атрибуты ниже (String, String и Date) и имеет размер всего 15 МБ. (Проверено в MongoDB Compass)

{
    "Unit" : 1.0,
    "VendorCode" : 1.0,
    "EmissionDate" : 1.0
}

Однако, когда я запускаю следующий запрос к коллекции, для возврата требуется много времени.

db.Collection.find({
        'Unit': '016406',
        'EmissionDate': {$gte: new ISODate('2018-08-01')}
    }, {
        'Unit': 1,
        'VendorCode': 1,
        'EmissionDate': 1
    })

По моему опыту работы с базами данных SQL такой запрос поверх индекса такого размера мгновенно возвращался бы. Однако, когда я запускаю его на MongoDB, через оболочку на машине или Robo3T, это занимает больше 10 минут!

Мне кажется, что когда запрос находит документы, Монго по какой-то причине извлекает их из хранилища. Но это только предположение.

Я забыл принять во внимание некоторые базовые лучшие практики с MongoDB? Какие идеи вы могли бы дать мне, чтобы исследовать эту проблему?

1 Ответ

0 голосов
/ 05 сентября 2018

Ваш индекс не соответствует вашим критериям.

'Unit': '016406',
'EmissionDate': {$gte: new ISODate('2018-08-01')}

Вы хотите другой индекс:

{
    "Unit" : 1.0,
    "EmissionDate" : 1.0
}

Ваш существующий индекс поддерживает только следующие критерии:

{Unit}
{Unit, VendorCode}
{Unit, VendorCode, EmissionDate}

Подробнее о префиксе в составном индексе здесь

Имейте в виду, что mongodb будет использовать не более одного индекса или пересечения индексов для покрытия вашего запроса + сортировки (если есть).

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