我有成千上萬個這樣的檔案:
{
"field_id" : "abcd",
"aField" : 0,
"parentList": [
{
"field": "value1",
"list": ["element1,element2"]
}
,
{
"field": "value2",
"list": ["element1, element3"]
}
]
}
(這是我的資料庫中更大檔案的過度簡化版本,包含更多欄位。資料庫包含數百萬個檔案)。這是我想用于計數執行的過濾器:
{ 'parentList.0.list':
{ '$in':
[ 'element1',
'element2',
'element3',
'element4'
]
},
aField: { '$ne': 1 },
field_id: { '$in': [ 'abcd' ] }
}
我想要做的是創建一個這樣的索引:
{"field_id" : 1, "parentList.list" :1, "aField" : 1}
并讓查詢使用它。但 mongo 實際上忽略了它。相反,mongo 正在使用另一個索引,即
{"field_id":1, "anotherField":1}
執行統計顯示了這個階段:
- {"field_id":1, "anotherField":1} 索引上的 IXSCAN,產生 500k 個keysExamined,這是 500k 個具有 field_id = 'abcd' 的檔案
- 獲取過濾器的其余部分,回傳 20k 作為計數
當然,如果 mongo 使用了正確的索引,我希望它已經從 IXSCAN 檢索了 20k 個檔案,或者至少是一個更接近的數字。
我只是不明白為什么 mongo 不使用該索引。我還嘗試更改索引中欄位的順序,但沒有成功。我正在使用 Mongo 4.4.6
uj5u.com熱心網友回復:
Mongo 有時會使用錯誤的索引,我建議您在此處閱讀我的回答,其中解釋了為什么會發生這種情況。
為了“修復”您應該使用$hint的行為,它將強制 Mongo 使用您指定的特定索引。
uj5u.com熱心網友回復:
有沒有這個指數
{"field_id":1, "anotherField":1}
適用于針對您的資料庫的大多數查詢?
根據我的經驗,MongoDB 經常會選擇一個非常通用的索引,即使有時更具體的索引更好。我通過使索引更特定于它們的用途來解決這個問題(并洗掉“全能”索引)。我不知道這是否適用于您的用例,因為所選索引的原因尚不清楚。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/389738.html
標籤:MongoDB 索引 mongodb-查询 复合指数
