使用mongodb建立索引:性能不佳/ indexOnly = false

Max*_*Max 2 indexing mongodb

我在运行的8GB linux机器上有一个mongodb.目前它处于测试模式,因此很少有其他请求进入,如果有的话.

我有一个colelction项目,其中包含100万个文档.我创建的字段的索引:对等组和CategoryIds(其为3-6的元件,这将在一个多键得到的阵列): db.items.ensureIndex({PeerGroup:1, CategoryIds:1}.

当我在查询时

db.items.find({"CategoryIds" : new BinData(3,"xqScEqwPiEOjQg7tzs6PHA=="), "PeerGroup" : "anonymous"}).explain()
Run Code Online (Sandbox Code Playgroud)

我有以下结果:

{
    "cursor" : "BtreeCursor PeerGroup_1_CategoryIds_1",
    "isMultiKey" : true,
    "n" : 203944,
    "nscannedObjects" : 203944,
    "nscanned" : 203944,
    "nscannedObjectsAllPlans" : 203944,
    "nscannedAllPlans" : 203944,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 1,
    "nChunkSkips" : 0,
    "millis" : 680,
    "indexBounds" : {
            "PeerGroup" : [
                    [
                            "anonymous",
                            "anonymous"
                    ]
            ],
            "CategoryIds" : [
                    [
                            BinData(3,"BXzpwVQozECLaPkJy26t6Q=="),
                            BinData(3,"BXzpwVQozECLaPkJy26t6Q==")
                    ]
            ]
    },
    "server" : "db02:27017"
Run Code Online (Sandbox Code Playgroud)

}

我认为680ms并不是那么快.或者这可以接受吗?另外,为什么说"indexOnly:false"?

Ada*_*ord 5

我认为680ms并不是那么快.或者这可以接受吗?

这种情况取决于这些物体的大小以及这是否是第一次运行.假设您返回的整个数据集(包括索引)适合内存,那么下次运行它时它将是内存中查询,然后将基本上尽快返回.nscanned高意味着这个查询不是很有选择性,大多数记录在PeerGroup中都有一个"匿名"值?如果是这样,并且CategoryId更具选择性,那么您可以尝试使用索引{CategoryIds:1, PeerGroup:1}(使用hint()来尝试相对于另一个).

另外,为什么说"indexOnly:false"

这只是表明您希望返回的所有字段都不在索引中,BtreeCursor表示索引用于查询(BasicCursor意味着它没有).要使其成为indexOnly查询,您需要{_id : 0, PeerGroup:1, CategoryIds:1}投影中仅返回索引中的两个字段(即:).这意味着它永远不会触及数据本身,只能从索引中返回您需要的所有内容.