Query-Performance

MongoDB 搜尋詞的順序對查詢性能有影響嗎?

  • June 21, 2021

MongoDB 中搜尋詞的順序是否重要?我從learnmongodbthehardway發現了這個文件,警告不要使用 $ ne and $ nin:

如果你需要使用這些

$$ $nin and $ne $$確保您盡可能使用索引進行過濾並保留 $ nin and $ 查詢選擇器最後部分的 ne 項。

我一直認為搜尋詞的順序無關緊要。我還沒有製作足夠豐富的數據集來證明/反駁這一點。

讓我們考慮一個包含如下文件的集合:

{
   _id: 1, 
   firstname: "john", 
   lastname: "doe", 
   city: "Chicago",
   // ... other fields 
}

如果您正在搜尋集合:

db.collection.find( { firstname: "john", lastname: "doe" } )
// - or -
db.collection.find( { lastname: "doe", firstname: "john" } )

輸出是一樣的。

在搜尋條件(或過濾器)中使用的欄位上創建索引 - 用於快速搜尋。假設在兩個欄位上創建索引,如下所示:

db.collection.createIndex({ lastname: 1, firstname: 1 } )

索引創建後,上述兩個查詢執行相同的方式,並以相同的方式使用上述索引進行搜尋。搜尋條件中欄位的順序無關緊要(在這種情況下)。

此查詢還使用上述索引:

db.collection.find( { lastname: "doe" } )

但是,以下查詢不會:

db.collection.find( { firstname: "john" } )

也就是說,在索引中指定欄位的順序很重要。也就是說,創建一個索引:

{ lastname: 1, firstname: 1 }

不一樣:

{ firstname: 1, lastname: 1 }

查詢選擇性

以下查詢使用這兩個欄位,例如,

db.collection.find( { lastname: "doe", firstname: "john" } )

並且使用這兩個欄位的索引,索引中欄位的順序很重要。這主要由稱為查詢選擇性的因素決定。

查詢選擇性決定了索引的第一個欄位過濾了大量的文件,因此後面的索引欄位可以選擇的最少。例如,如果集合中有 100 萬個文件,並且有 2000 個文件的“doe”為lastname,則查詢是選擇性的,索引為{ lastname: 1, firstname: 1 }。假設,在同一個數據集和查詢上,有索引,{ firstname: 1, lastname: 1 }並且有 250,000 個帶有“john”的文件firstname,它不是一個非常有選擇性的文件(因為需要進一步搜尋 250,000 個文件以查找姓氏“doe”,這不是很高效)。

通常,帶有$ne和的查詢$nin被認為不是很有選擇性。

如何確定查詢是否使用索引或使用正確的索引?

您可以對查詢使用explain方法,它會為該查詢生成一個查詢計劃。查詢計劃告訴查詢是否正在使用索引,或者是否有多個索引正在使用其中一個,或者根本沒有使用索引。此外,還有一些選項可以查看其他資訊,例如查詢使用索引所花費的時間等。

引用自:https://dba.stackexchange.com/questions/294509