MongoDB C#驱动程序执行速度快(1),但执行速度慢(2)

本文关键字:执行 速度慢 速度快 MongoDB 驱动程序 | 更新日期: 2023-09-27 18:29:07

我第一次使用MongoDB C#驱动程序,在性能方面发现了一些奇怪的结果。当我用ordering和.Take(1)查询一个包含300万条记录的集合时,响应几乎是即时的(3毫秒)。但当我在同一查询中使用.Take。正确的索引已经到位,这是一个非常简单的测试数据集合。

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#驱动程序执行速度快(1),但执行速度慢(2)

MongoDB C#驱动程序将翻译一个字符串。将方法包含到正则表达式中。因此c.SearchStringContains("abc")将被翻译为:

{ SearchString : /abc/ }

然而,MongoDB只能在"以"开头的regex上使用索引。引用文件:

$regex只能在正则表达式在字符串的开头(即^)有一个锚点,并且是区分大小写匹配。此外,当/^a/,/^a/,和/^a$/匹配相同的字符串,它们具有不同的性能特性。如果存在适当的指标;然而,/^a/,和/^a$/较慢。/^a/可以在匹配前缀之后停止扫描。

我怀疑,如果您在查询中使用explain命令,您会发现包含SearchString字段的索引没有得到有效使用。

我认为Take(1)Take(2)快的原因可能是SearchString索引仅用于查询的排序部分,并且第一个匹配发生在B-树遍历的早期。第二种情况可能发生在B树遍历的晚些时候,导致nscan(服务器扫描以查找结果的文档数)高得多。

为了解决这个问题并能够使用索引,我建议使用关键字搜索方法;或者,如果你有v2.4+版本,你可以尝试文本搜索功能。