MongoDB ixscan 掃描的對像似乎比預期的多
我正在使用 MongoDB 2.6.12 並且一個集合具有以下索引 {a: 1, d: -1}。如果類型很重要,a 是數字,d 是時間戳。
從我在程式碼中可以看到,我們將此查詢限制為 21 個文件。但是,下面的查詢日誌表明該索引已被使用,但它仍然掃描了 903483 個文件。
2016-05-27T22:13:05.722-0700
$$ conn890 $$查詢 my.collection 查詢:{ $ query: { a: 12345 }, $ orderby: { d: -1 } } planSummary: IXSCAN { a: 1, d: -1 } cursorid:312034207299 ntoreturn:21 ntoskip:903462 nscanned:903483 nscannedObjects:903483 keyUpdates:0 numYields:89 locks(micros) r:3550704 n返回:21 reslen:1028 1820ms 我們正在使用 pymongo 2.8.1 和 mongengine 0.7.9
誰能解釋為什麼以及我們是否真的在此查詢中掃描大量對像以及我應該尋找什麼來解決問題?
大量的
nscanned
鍵比較可以用跳過值來解釋:查詢跳過 903,462 個文件 (ntoskip
) 以返回 21 (ntoreturn
)。輸出中的nscanned
值是 和 的ntoskip
總和ntoreturn
。
nscannedObjects
(與 相同)的數量nscanned
是因為 MongoDB 2.6.x 查詢處理中的跳過階段發生在文件獲取和投影階段之後。您可以在 MongoDB 問題跟踪器中觀看和支持一些跳過性能的建議優化:
一般來說,不鼓勵使用較大的 skip 值(請參閱:
cursor.skip()
文件)。根據您的案例
skip()
,可以考慮的替代方法包括:
- 如果可能,使用基於範圍的查詢進行分頁
- 限制 API/UI 的分頁(跳過值 903,462 個文件,每頁 21 個意味著此查詢可能針對第 43,023 頁的結果)
- 使用
$sample
(MongoDB 3.2+)或替代方法來獲取/採樣隨機文件