慢我有這樣的文檔結構:MongoDB的查詢與點符號
{
"key": {
"a": Int32,
"b": String
}
}
與key.a
和key.b
上key
和索引(非唯一)的唯一指標。
然而,這個查詢掃描(slooow):
{"key.a": 456213154}
與此查詢不:
{"key": {
"a": 456213154,
"b": {"$exists": true}
}}
爲什麼是必要的,而且應該是什麼?
(我應該指出,這是V2.0.3)
編輯:加入解釋:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BtreeCursor key.a_1",
"nscanned" : 10962,
"nscannedObjects" : 10962,
"n" : 10962,
"millis" : 20,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key.a" : [
[
456213154,
456213154
]
]
}
}
> db.collection.find({"key": {"a": 456213154, "b": {"$exists":true}}}).explain()
{
"cursor" : "BtreeCursor key_1",
"nscanned" : 0,
"nscannedObjects" : 0,
"n" : 0,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"key" : [
[
{
"a" : 456213154,
"b" : {
"$exists" : true
}
},
{
"a" : 456213154,
"b" : {
"$exists" : true
}
}
]
]
}
}
編輯:我試圖消除兩個非唯一索引(key.a_1
和key.b_1
),看看是否這可能會影響查詢。這不是:
> db.collection.find({"key.a": 456213154}).explain()
{
"cursor" : "BasicCursor",
"nscanned" : 23240518,
"nscannedObjects" : 23240518,
"n" : 10962,
"millis" : 15047,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
}
}
你可以在兩個查詢上發佈'explain()'運行的輸出嗎? http://www.mongodb.org/display/DOCS/Explain – shelman
根據'explain'輸出,你有10962個文檔,其中''key.a''是456213154,並且他們都沒有'鍵。 b'領域。那是對的嗎? – JohnnyHK
所有'key'子文檔總是有'a'和'b'。沒有任何用例可能會丟失或「空」。 – nilskp