Je cours une requête MongoDB assez ordinaire, rien de vraiment complexe ou spécial et je me demande si le temps qu'il faut (> 1 sec) est normal ou si quelque chose ne va pas avec mes index.Optimiser MongoDB Query ou Index
J'ai fourni un index pour cette requête spécifique et explain()
me dit également qu'il est utilisé, mais il effectue un balayage complet de la collection à chaque fois et ralentit la page Web entière de> 1 seconde.
La requête:
db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"})
Expliqué:
> 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
}
]
]
}
}
L'indice:
{
"v": 1,
"key": {
"art_filter": 1,
"art_hauptartikelnr": 1
},
"ns": "togshop.tog_artikel",
"background": true,
"name": "art_filter_1_art_hauptartikelnr_1"
}
Pourquoi la collection complète scannée à chaque fois? Pourquoi isMultiKey
est faux et comment puis-je optimiser cette requête/index?
environnement est un serveur autonome, MongoDB 2.0.1, Linux 64 bits, accessible à partir de PHP w/php-mongo 1.2.6
Je vais ajouter que même si existe $ n'utilise un indice ces jours-ci, il doit encore marcher la plupart des b-arbre le satisfaire. En d'autres termes, vous avez réussi à utiliser deux des pires opérations ($ exists et $ where) dans une requête en termes de performances. –
@RemonvanVliet: J'étais sur le point de le mentionner, mais alors je pensais qu'un $ existe: false devrait être relativement efficace sur un index non-sparse (alors qu'un $ existe: true doit marcher la plupart de l'arbre). YMMV en fonction de l'asymétrie des données. – Thilo
Très vrai. $ exists: false est l'approche la plus efficace en raison de la sortie précoce des promenades dans les arbres. Quoi qu'il en soit, il est généralement préférable d'éviter $ existe si vous pouvez et $ où presque toujours;) –