簡體   English   中英

MongoDB C#驅動程序快速執行(1)但速度慢(2)

[英]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更高(服務器掃描查找結果的文檔數)。

要解決此問題並能夠使用索引,我建議使用關鍵字搜索方法 ; 或者,如果你有v2.4 +,你可以嘗試文本搜索功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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