Ich bin eine ganz normale MongoDB Abfrage, nichts wirklich komplex oder speziell und ich frage mich, ob die Zeit (> 1 sec) normal ist oder wenn etwas mit meinen Indizes nicht stimmt.Optimieren MongoDB Abfrage oder Index
Ich habe einen Index für diese spezifische Abfrage und explain()
auch sagt mir, es wird verwendet, aber es macht einen vollständigen Scan der Sammlung jedes Mal und verlangsamt die gesamte Webseite um> 1 Sek.
Die Abfrage:
db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"})
Erklärt:
> db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"}).explain()
{
"cursor" : "BtreeCursor art_filter_1_art_hauptartikelnr_1",
"nscanned" : 21306,
"nscannedObjects" : 21306,
"n" : 21306,
"millis" : 1180,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"art_filter" : [
[
null,
null
]
],
"art_hauptartikelnr" : [
[
{
"$minElement" : 1
},
{
"$maxElement" : 1
}
]
]
}
}
Der Index:
{
"v": 1,
"key": {
"art_filter": 1,
"art_hauptartikelnr": 1
},
"ns": "togshop.tog_artikel",
"background": true,
"name": "art_filter_1_art_hauptartikelnr_1"
}
Warum die vollständige Sammlung jedes Mal gescannt wird? Warum ist isMultiKey
falsch und wie kann ich diese Abfrage/Index optimieren?
Environment ist ein eigenständiger Server, MongoDB 2.0.1, 64-Bit-Linux, zugegriffen von PHP w/php-Mongo 1.2.6
ich hinzufügen, dass werde, dass, obwohl $ existiert in diesen Tagen einen Index verwendet sie hat immer noch den größten Teil der B-Baum zu Fuß zu erfülle es. Mit anderen Worten, Sie haben zwei der schlechtesten Operationen ($ exists und $ where) in einer Abfrage in Bezug auf die Leistung verwendet. –
@RemonvanVliet: Ich war dabei, das zu erwähnen, aber dann dachte ich, ein $ exists: false sollte relativ effizient auf einem nicht-spärlichen Index sein (während ein $ existiert: true muss den größten Teil des Baumes gehen). YMMV abhängig von Datenschräglauf. – Thilo
Sehr wahr. $ exists: false ist der effizientere Ansatz aufgrund der frühen Baumspaziergänge. Egal, es ist im Allgemeinen besser zu vermeiden $ existiert, wenn Sie können und $ wo ziemlich immer;) –