2016-03-15 35 views
3

使用Mongo 3.2。MongoDB - 與查詢不同,不使用索引

比方說,我有這個模式的集合:

{ _id: 1, type: a, source: x }, 
{ _id: 2, type: a, source: y }, 
{ _id: 3, type: b, source: x }, 
{ _id: 4, type: b, source: y } 

當然,我的db是大得多,還有更多的類型和來源。

我已經創建了4個指標種類和來源的組合(即使1應該是足夠了):

{type: 1} 
{source: 1}, 
{type: 1, source: 1}, 
{source: 1, type: 1} 

現在,我正在此不同的查詢:

db.test.distinct("source", {type: "a"}) 

的問題是,這個查詢需要花費更多的時間。 如果我runCommand運行:

db.runCommand({distinct: 'test', key: "source", query: {type: "a"}}) 

這是結果我得到:

{ 
    "waitedMS": 0, 
    "values": [ 
     "x", 
     "y" 
    ], 
    "stats": { 
     "n": 19400840, 
     "nscanned": 19400840, 
     "nscannedObjects": 19400840, 
     "timems": 14821, 
     "planSummary": "IXSCAN { type: 1 }" 
    }, 
    "ok": 1 
} 

出於某種原因,蒙戈只使用type: 1索引進行查詢的階段。 它應該使用索引也爲不同階段。 這是爲什麼?使用{type: 1, source: 1}指數會好很多,不是嗎?現在它正在掃描所有type: a文檔,同時它有一個索引。

我做錯了什麼?對於這種獨特的方式,我有更好的選擇嗎?

回答

1

正如Alex所說,顯然MongoDB現在不支持這個。 有一個問題: https://jira.mongodb.org/browse/SERVER-19507

+0

來自問題,看起來應該已經在3.4中實現了? –

+0

@Alvin Wong你說得對,謝天謝地這個功能已經在Mongo 3.4中實現了。 – Robert

-1

只是放棄前兩個索引。你不需要它們。 Mongo可以在任何可能需要{type: 1}索引的查詢中使用{type: 1, source: 1}

+0

它不會改變結果。是的,它將使用{type:1,source:1}索引,但僅用於查詢階段,而不用於不同的階段,因此時間和摘要是相同的 – TomG

+0

它不使用不同階段的索引,除非索引從鑰匙開始。在你的情況下,如果查詢爲空,'{source:1}'可用於'DISTINCT_SCAN'。 –

+0

我知道,但這不是我想要的。我想區分查詢,所以它應該在'{type:1,source:1}'上使用'DISTINCT_SCAN'索引 – TomG