[英]MongoDB C# driver fast on take(1) but slow on take(2)
我第一次玩MongoDB C#驅動程序,我發現性能有些奇怪。 當我查詢一個有300萬條記錄並且訂購的集合時。(1)響應幾乎是瞬間的(3毫秒)。 但是當我。在同一個查詢中采取(2)它需要10秒。 正確的索引就位,它是一個包含測試數據的非常簡單的集合。
MongoClient client = new MongoClient();
MongoServer server = client.GetServer();
var database = server.GetDatabase("db_name");
var collection = database.GetCollection<MyType>("collection_name");
var query = from c in collection.AsQueryable<MyType>()
where c.SearchString.Contains(searchString)
orderby c.SearchString
select c.SearchString;
List<string> results = query.Take(2).ToList();
MongoDB C#驅動程序會將string.Contains方法轉換為正則表達式。 所以c.SearchStringContains("abc")
將被翻譯為:
{ SearchString : /abc/ }
但是,MongoDB只能在“start with”正則表達式上使用索引。 引用文檔 :
當正則表達式具有字符串開頭(即^)的錨點並且是區分大小寫的匹配時,$ regex只能有效地使用索引。 另外,當/ ^ a /,/ ^ a。 /,和/ ^ a。 $ /匹配等效字符串,它們具有不同的性能特征。 如果存在適當的索引,則所有這些表達式都使用索引; 但是,/ ^ a。 /,和/ ^ a。 $ /更慢。 / ^ a /可以在匹配前綴后停止掃描。
我懷疑如果在查詢中使用explain命令 ,您將看到包含SearchString
字段的索引未被有效使用。
我相信Take(1)
比Take(2)
更快的原因可能是你的SearchString
索引僅用於查詢的排序部分,並且第一次匹配很早就發生在B-Tree中步行。 第二次出現很可能在B-Tree漫游中發生得更晚,導致nscan
更高(服務器掃描查找結果的文檔數)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.