在字段“Base.UserID”上获得了5000多万个文档和非唯一索引 replicaset和连接字符串中的两个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的第二次点击更快)
答案 0 :(得分:0)
您的索引未被使用。如果您通过“Base.UserID”和“Base.Visible”进行查询,则需要包含两个字段的复合索引。
答案 1 :(得分:0)
“scanAndOrder”:是的,如果可能的话,你希望这是假的。
我相信您可能希望将您的排序添加到索引中。
eventCollection.EnsureIndex(IndexKeys.Ascending("Base.UserID"), IndexKeys.Descending("SQLId"), IndexOptions.SetName("Event.Base.UserID"));