【问题标题】:MongoDB c# driver slow find on indexMongoDB c#驱动程序在索引上缓慢查找
【发布时间】:2013-07-01 13:50:25
【问题描述】:

在字段“Base.UserID”上获得了 50+ 百万个文档和非唯一索引 副本集和连接字符串中的两个 mongo 服务器:

<add name="MongoConnectionString" connectionString="mongodb://mango1,mango2:27017" />

受保指数:

var eventCollection = Collection<EventMongo>();
eventCollection.EnsureIndex(IndexKeys.Ascending("Base.UserID"), IndexOptions.SetName("Event.Base.UserID"));

然后我找到了

                var _Set = new SortedSet<Int64>();
                using (var db = new BaseDataAccess())
                {
                    var col = db.Collection<EventMongo>();
                    var counter = 0;
                    var query = Query.And(
                        Query.EQ("Base.UserID", UserID),
                        Query.EQ("Base.Visible", 1)
                    );

                    var _docs = col.Find(query);
                    _docs.SetFields(new[] {"SQLId"});        
                    _docs.SetSortOrder(SortBy.Descending("SQLId"));
                    _docs.SetLimit(HowMany);

                    int i = 0;                       

                    foreach (var doc in _docs)
                    {   
                        var _EventID = doc.SQLId;
                        _Set.Add(_EventID);
                        if (++counter >= HowMany) break;
                    }
                }

                return _Set;

相同的文档包含一个并行的 MS SQL 数据库,我提到读取 MongoDB 的第一个查询比 MS SQL 需要更多的时间(最多 5 秒)! (同一个UserID的第二次命中更快)

【问题讨论】:

  • 您可以使用控制台确认索引是否存在且正确吗?从控制台中查询的查询计划是什么样的?
  • 只是为了确定,您没有在查询之前在生产代码中运行 EnsureIndex 语句,对吧?
  • @AntonioOtero,当然我只做一次 EnsureIndex。
  • @WiredPrairie 我可以使用var _stat = _docs.Explain(); 它告诉我{ "cursor" : "BtreeCursor Event.Base.UserID", "isMultiKey" : false, "n" : 12, "nscannedObjects" : 12, "nscanned" : 12, "nscannedObjectsAllPlans" : 37, "nscannedAllPlans" : 37, "scanAndOrder" : true, "indexOnly" : false, "nYields" : 0, "nChunkSkips" : 0, "millis" : 0, "indexBounds" : { "Base.UserID" : [[2767205, 2767205]] }, "server" : "MANGO:27017" }

标签: mongodb mongodb-.net-driver


【解决方案1】:

您的索引未被使用。如果您通过“Base.UserID”和“Base.Visible”进行查询,那么您需要一个包含这两个字段的复合索引。

【讨论】:

  • 我认为你不对,因为目标索引“Base.UserID”排在第一位。此外,我已经尝试只留下“Base.UserID - 它是一样的。
【解决方案2】:

"scanAndOrder" : true,如果可能,您希望它为 false。

我相信您可能希望将您的排序添加到索引中。

MongoBlog on Index Ordering

eventCollection.EnsureIndex(IndexKeys.Ascending("Base.UserID"), IndexKeys.Descending("SQLId"), IndexOptions.SetName("Event.Base.UserID"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 2017-07-14
    • 1970-01-01
    • 2012-03-04
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多