我正在做一個包含超過100百萬個文檔的集合。MongoDB:索引在100多個mio文檔上很慢
我的查詢是:
{
"domain": domain,
"categories" : "buzz",
"visit.timestamp" : { "$gte": date_from, "$lt": date_to },
}
我僅投影_id
。
我有一些指標就可以了,比如,每例如:
{ "visit.timestamp": -1 }
和複合索引,如:
{ "visit.timestamp": -1, "domain": 1, "categories" : 1 }
基於計數,每個例子中,30最後幾天給出的結果〜 30秒。 的explain()
讓我發現,查詢中使用最簡單的指標:{ "visit.timestamp": -1 }
所以我試圖強迫其他順序複合索引:
{ "categories" : 1, "domain": 1, "visit.timestamp": -1 }
{ "domain": 1, "categories" : 1, "visit.timestamp": -1 }
隨後,查詢使用其中的一個,但結果需要更長的時間:第一種情況下約60秒,另一種情況下,超過241秒!
注1:這與聚合框架的結果是一樣的,但並不奇怪。
注2:「visit.timestamp」是一個ISODate
。每個文檔比前一個文檔更新。
注意3:該計數返回約140萬個文件(在〜105百萬之間),但檢查了12百萬個文檔(見下文)。
問:
1 /我不知道爲什麼一個查詢中使用應該覆蓋它完全索引時需要更長的時間。你有解釋嗎?
2 /您有任何提示來改善此查詢的響應時間嗎? 的explain()
表明該查詢看了看:
"totalKeysExamined": 12628476,
"totalDocsExamined": 12628476,
因爲,我可以理解,該指數只覆蓋日期索引visit.timestamp
等所有文檔的時間框架內,已經進行審查。
2.1:我確定,因爲我在Mongoshell中進行測試:)。但是你回答關於索引適合內存可能會有所幫助,I4m不習慣看這個,因爲服務器擁有大部分時間足夠的內存(128G)並且只能與SSD一起運行,但它看起來最糟糕。我稍後會回來確認並確認答案是正確的:)謝謝。 –
我在沙箱上的測試似乎證實索引不適合RAM。 –