MongoDB索引ensureIndex刷新时间

时间:2013-10-22 19:44:05

标签: mongodb casbah

我通过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 docs,看起来需要将ensureIndex称为一次,然后任何写入都会强制更新索引。

但是,我看到了postone,只需要拨打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"

请注意 nScanned (9412)>的计数(4248)。

> db.collection.count()
4248

为什么?

1 个答案:

答案 0 :(得分:1)

关于超过计数的“nscanned”,这可能是因为您实际上拥有的索引条目多于您拥有的文档:列表中的每个项目都是索引条目。在这里,您似乎每个文档的列表中平均有2个项目。 “nscannedObjects”遵循相同的原则,因为只要查看文档,该计数器就会递增,即使同一文档之前已作为同一查询的一部分进行过查看也是如此。