2

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

我有一个收藏品,里面有 100 万份文件。我正在以下字段上创建索引:PeerGroup 和 CategoryIds(这是一个由 3-6 个元素组成的数组,将在多键中产生)db.items.ensureIndex({PeerGroup:1, CategoryIds:1}:。

当我查询时

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

我有以下结果:

{
    "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"

}

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

4

1 回答 1

5

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

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

另外,为什么说“indexOnly:false”

这只是表示您希望返回的所有字段都不在索引中,BtreeCursor表示索引已用于查询(BasicCursor 表示它没有)。要使这是一个indexOnly查询,您只需{_id : 0, PeerGroup:1, CategoryIds:1}在您的projection中返回索引中的两个字段(即:) 。这意味着它永远不必接触数据本身,并且可以仅从索引中返回您需要的所有内容。

于 2012-09-01T12:40:10.067 回答