簡體   English   中英

MongoDB在索引字段上的查詢非常慢

[英]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_deletedtruefalse文檔花費相同的時間。 更重要的是,為什么用!= 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM