MongoDB 搜尋詞的順序對查詢性能有影響嗎?
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方法,它會為該查詢生成一個查詢計劃。查詢計劃告訴查詢是否正在使用索引,或者是否有多個索引正在使用其中一個,或者根本沒有使用索引。此外,還有一些選項可以查看其他資訊,例如查詢使用索引所花費的時間等。