我正在運行一個非常普通的MongoDB查詢,沒有什麼真正的複雜或特殊的,我想知道如果它需要的時間(> 1秒)是正常的,或者如果我的索引有問題。優化MongoDB查詢或索引
我爲這個特定的查詢提供了一個索引,explain()
也告訴我它已經被使用了,但是它每次都會對這個集合進行全面掃描,並且整個網頁速度減慢大於1秒。
查詢:
db.tog_artikel.find({"art_filter":{"$exists":false},"$where":"this._id == this.art_hauptartikelnr"})
解釋:
> 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
}
]
]
}
}
指數:
{
"v": 1,
"key": {
"art_filter": 1,
"art_hauptartikelnr": 1
},
"ns": "togshop.tog_artikel",
"background": true,
"name": "art_filter_1_art_hauptartikelnr_1"
}
爲什麼全額徵收掃描的每一次?爲什麼isMultiKey
是錯誤的,我該如何優化這個查詢/索引?
環境是一個獨立的服務器,MongoDB的2.0.1,64位Linux,訪問從PHP瓦特/ PHP-1.2.6蒙哥
我將添加到,雖然存在$不使用索引,這些天它仍然走大部分的B樹來滿足它。換句話說,在性能方面,您設法在一個查詢中使用兩個最糟糕的操作($ exists和$ where)。 – 2012-04-11 12:38:42
@RemonvanVliet:我剛纔提到,但後來我認爲存在$存在:在非稀疏索引中false應該是相對有效的(而$ exists:true必須走大部分樹)。 YMMV取決於數據傾斜。 – Thilo 2012-04-11 12:42:27
非常真實。 $ exists:false是由於在樹中行走而提前更有效的方法。無論如何,避免使用$ exists,如果可以的話,通常會更好; $ – 2012-04-11 12:56:14