【发布时间】: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