Ich habe eine Sammlung von Protokollen mit Millionen von Datensätzen. Das Erstellen eines neuen Indexes dauert "für immer". Daher wäre es vorzuziehen, vorhandene Indizes zu verwenden.MongoDB verwendet nicht meinen Index
Jetzt möchte ich die Anzahl der Vorkommen bestimmter Fehlercodes erhalten. Ich benutze diese Abfrage, und es funktioniert funktionell in Ordnung:
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}
}
]);
Das Problem ist, dass es auch in der Nähe von 10 Sekunden dauert nur diese für einen Tag auszuführen. Ich hatte die folgende Index verwendet würde angenommen: [email protected]_1
:
{
"timeStamp" : -1,
"[email protected]" : 1
}
jedoch MongoDB scheint unerbittlich etwas timeStamp: 1
Index zu verwenden (mit einigen anderen Indizes in keinem Zusammenhang mit der Abfrage) und scannen alllllll die Ergebnisse, wenn einige Antworten zu sehen könnte eine ErrorCode
angehängt haben, obwohl diese Information im Index enthalten sein sollte. Hier
ist die explain()
:
- Gibt es eine Möglichkeit, die
[email protected]_1
Index verwenden dies zu beschleunigen? - Warum ist nicht es mit diesem Index? Ich bin wahrscheinlich missverstanden, wie Indizes in dieser Abfrage verwendet werden.
Lauf MongoDB 3.2.7 auf OSX.
hinweis: Ich habe auch versucht $empty: true
statt $ne: null
. Es führt zu den gleichen Ergebnissen, aber einige sagen, Sie können $empty
nicht verwenden, wenn Sie einen zusammengesetzten Index verwenden möchten. Viele Fragen zu Stack Overflow sind jedoch alt (mongo 2.x).
Soweit ich weiß, ist Hinting für Testzwecke und Sie können keinen Index Hinweis auf eine Aggregation Pipeline setzen. – Redsandro
Sie können die Funktion PlanCacheSetFilter vor dem Aggregat – Marco