У меня есть коллекция журналов с миллионами записей. Создание нового индекса занимает «вечность». Поэтому было бы предпочтительнее использовать существующие индексы.
Теперь я хочу получить количество вхождений определенных кодов ошибок. Я использую этот запрос, и функционально он отлично работает:
db.getCollection('logs.res').aggregate([
{
$match:{
timeStamp: {
$gte: new Date('2017-05-01').getTime(), // timeStamp is Number
$lt : new Date('2017-05-02').getTime() // of ms since epoch
},
'[email protected]': {
$ne: null
}
}
},
{
$group: {
_id: '[email protected]',
count: {$sum: 1}
}
},
{
$sort: { count: -1}
}
]);
Проблема в том, что для выполнения этого в течение дня требуется около 10 секунд. Я предполагал, что будет использоваться следующий индекс: [email protected]_1
:
{
"timeStamp" : -1,
"[email protected]" : 1
}
Тем не менее, MongoDB, похоже, непреклонно использует некоторый индекс timeStamp: 1
(с некоторыми другими индексами, не связанными с запросом) и сканирует все результаты, чтобы увидеть, могут ли некоторые ответы иметь прикрепленный ErrorCode
, даже если эта информация должна быть в индексе.
Вот explain()
:
- Есть ли способ использовать
[email protected]_1
индекс, чтобы ускорить это? - Почему не используется этот индекс? Вероятно, я неправильно понимаю, как индексы используются в этом запросе.
Запуск MongoDB 3.2.7 на OSX.
примечание: я также пробовал $empty: true
вместо $ne: null
. Он дает те же результаты, но некоторые говорят, что вы не можете использовать $empty
, если хотите использовать составной индекс. Однако многие вопросы о переполнении стека устарели (mongo 2.x).