Ich habe eine Sammlung von Dokumenten mit einem MultiKey-Index definiert. Die Leistung der Abfrage ist jedoch ziemlich schlecht für nur 43 KB-Dokumente. Wird ~ 215ms für diese Anfrage als schlecht angesehen? Habe ich den Index richtig definiert, wenn nscanned 43902 ist (was den gesamten Dokumenten in der Sammlung entspricht)?MongoDB Index hilft nicht Abfrage mit MultiKey-Index
Dokument:
{
"_id": {
"$oid": "50f7c95b31e4920008dc75dc"
},
"bank_accounts": [
{
"bank_id": {
"$oid": "50f7c95a31e4920009b5fc5d"
},
"account_id": [
"ff39089358c1e7bcb880d093e70eafdd",
"adaec507c755d6e6cf2984a5a897f1e2"
]
}
],
"created_date": "2013,01,17,09,50,19,274089",
}
Index:
{ "bank_accounts.bank_id" : 1 , "bank_accounts.account_id" : 1}
Abfrage:
db.visitor.find({ "bank_accounts.account_id" : "ff39089358c1e7bcb880d093e70eafdd" , "bank_accounts.bank_id" : ObjectId("50f7c95a31e4920009b5fc5d")}).explain()
Erklären:
{
"cursor" : "BtreeCursor bank_accounts.bank_id_1_bank_accounts.account_id_1",
"isMultiKey" : true,
"n" : 1,
"nscannedObjects" : 43902,
"nscanned" : 43902,
"nscannedObjectsAllPlans" : 43902,
"nscannedAllPlans" : 43902,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 213,
"indexBounds" : {
"bank_accounts.bank_id" : [
[
ObjectId("50f7c95a31e4920009b5fc5d"),
ObjectId("50f7c95a31e4920009b5fc5d")
]
],
"bank_accounts.account_id" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
},
"server" : "Not_Important"
}
Eine Idee: Versuchen Sie, die Reihenfolge der Parameter zum Find umzudrehen, damit sie der durch den Index angegebenen Reihenfolge entsprechen. Wenn Sie nur eine Suche nach bank_id durchführen, verwendet das dann den Index? Dies sollte in der Reihenfolge erfolgen, die in secureindex angegeben ist. – WiredPrairie
@WiredPrairie: Hinzufügen eines zweiten Index, der der Reihenfolge der Suchparameter entspricht, hat nicht geholfen. Und ja, wenn ich nur nach bank_id suche, wird ein Index verwendet (scannt aber immer noch 43K Dokumente). – Jason
Könnten Sie einfach einen einzigen Index '{" bank_accounts.bank_id ": 1}' erstellen und nur die bank_id versuchen? Es ist sehr seltsam, dass es den Index nicht verwendet (Sie können den Index nach dem Test löschen). – WiredPrairie