MongoDB索引确保索引刷新时间



我通过Casbah(Mongo的Scala库)创建了一个多键复合索引:

db.collection.ensureIndex(MongoDBObject("Header.records.n" -> 1) ++ MongoDBObject("Header.records.v" -> 1) ++ MongoDBObject("Header.records.l" -> 1))

然后,通过Mongo Shell,我执行了一个db.collection.find(...).explain,其中nScannedObjects超过了db.collection.count()。查看 Mongo 文档,似乎需要调用一次 ensureIndex,然后任何写入都将强制更新索引。

但是,我看到了一个帖子,这个帖子只需要db.collection.ensureIndex(...)打电话一次。

编辑

>db.collection.find( {"Header.records" : {$all : [ 
{$elemMatch: {n: "Name", v: "Kevin", 
                         "l" : { "$gt" : 0 , "$lt" : 15}} }]}}, 
             {_id : 1}).explain()
    {
            "cursor" : "BtreeCursor         
     Header.records.n_1_Header.records.v_1_Header.records.l_1",
            "isMultiKey" : true,
            "n" : 4098,
            "nscannedObjects" : 9412,
            "nscanned" : 9412,
            "nscannedObjectsAllPlans" : 9412,
            "nscannedAllPlans" : 9412,
            "scanAndOrder" : false,
            "indexOnly" : false,
            "nYields" : 0,
            "nChunkSkips" : 0,
            "millis" : 152,
            "indexBounds" : {
                    "Header.records.n" : [
                            [
                                    "Name",
                                    "Name"
                            ]
                    ],
                    "Header.records.v" : [
                            [
                                    "Kevin",
                                    "Kevin"
                            ]
                    ],
                    "Header.records.l" : [
                            [
                                    0,
                                    1.7976931348623157e+308
                            ]
                    ]
            },
            "server" : "ABCD:27017"

请注意,n扫描 (9412)>计数 (4248)。

> db.collection.count()
4248

为什么?

关于"nscanned"超过计数,这是可能的,因为你实际上拥有的索引条目比你拥有的文档多得多:列表中的每个项目都是一个索引条目。似乎在这里,每个文档的列表中平均有 2 个项目。"nscannedObjects"遵循相同的原则,因为每当查看文档时,该计数器都会递增,即使之前已将同一文档作为同一查询的一部分查看。

最新更新