[英]MongoDB query over indexed field very slow
我的館藏中有大量文件(32 809 900)。 所有文檔都有一個名為soft_deleted
的字段。 我還創建了soft_deleted: 1
字段。 然后,我測試了一些與該字段相關的不同查詢。 這是我的結果:
Query Number of results Time in milliseconds
db.cgm_egvs
.find().count() 32809900 90
db.cgm_egvs
.find({soft_deleted: true}) 2820897 688
.count()
db.cgm_egvs
.find({soft_deleted: false}) 29989003 3983
.count()
db.cgm_egvs
.find({soft_deleted: null}) 0 42
.count()
db.cgm_egvs
.find({soft_deleted: {$ne: true}}) 29989003 82397
.count()
為什么這些查詢之間的查詢時間如此不同? 我希望找到soft_deleted
為true
或false
文檔花費相同的時間。 更重要的是,為什么用!= true
查詢比其他任何查詢都要慢得多?
soft_deleted字段的基數非常低。 它只有兩個不同的值true和false,因此在此字段上創建索引不會有太大好處。 通常,索引在具有高基數的字段上表現更好。
對於{soft_deleted:true}查詢,與{soft_deleted:false}相比,帶有soft_deleted:true的行數要少得多,並且mongodb必須掃描少得多的索引條目。 因此,{soft_deleted:true}查詢花費的時間更少。
類似地,查詢{soft_deleted:null}花費的時間更少,因為索引只有2個不同的值,在這種情況下,所需的掃描速度要低得多。
您的最終查詢使用$ ne運算符,而$ ne運算符不是選擇性的(選擇性是查詢使用索引縮小結果的能力)。 https://docs.mongodb.com/v3.0/faq/indexes/#using-ne-and-nin-in-a-query-is-slow-why 。 因此,執行花費了更多時間。
我不確定為什么其他查詢會很慢(我正在等待解釋轉儲),但是在$ ne的情況下,關鍵是我們在其中添加了額外的步驟,因此這意味着此函數先包裝成等號,然后是不等號->請參閱以下parsedQuery部分中的說明轉儲,並查找不執行步驟
db.getCollection('a1')。find({Level:{$ ne:“ Info”}}})。explain()
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "logi.a1",
"indexFilterSet" : false,
"parsedQuery" : {
"$not" : {
"Level" : {
"$eq" : "Info"
}
}
},
db.getCollection('a1')。find({Level:“ Info”})。explain()
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "logi.a1",
"indexFilterSet" : false,
"parsedQuery" : {
"Level" : {
"$eq" : "Info"
}
},
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.