0

フィールド「Base.UserID」で5000万以上のドキュメントと一意でないインデックスを取得しましたレプリカセットと接続文字列の2つの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 db が含まれており、MongoDB への読み取りの最初のクエリは MS SQL よりも時間がかかる (最大 5 秒) ことを述べています。(同じ UserID での 2 回目のヒットは高速です)

4

2 に答える 2

0

"scanAndOrder" : true、可能であればこれを false にします。

並べ替えをインデックスに追加したいと思うかもしれません。

インデックスの順序に関する MongoBlog

eventCollection.EnsureIndex(IndexKeys.Ascending("Base.UserID"), IndexKeys.Descending("SQLId"), IndexOptions.SetName("Event.Base.UserID"));
于 2014-04-03T20:17:02.150 に答える
0

インデックスは使用されていません。「Base.UserID」と「Base.Visible」でクエリを実行する場合は、両方のフィールドを持つ複合インデックスが必要です。

于 2013-07-01T18:01:36.023 に答える