我在一台8 8GB的linux机器上运行了一个mongodb。目前它处于测试模式,所以几乎没有其他的请求进来。
我有一个收藏项目,里面有一百万个文档。我在以下字段上创建了一个索引: 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“?
发布于 2012-09-01 20:40:10
,我认为680ms不是很快。或者这是可以接受的?
这取决于这些对象有多大,以及这是否是第一次运行。假设您返回的整个数据集(包括索引)都适合内存,那么下次您运行它时,它将是内存中的查询,然后将以尽可能快的速度返回。nscanned是高的,这意味着这个查询不是很有选择性,大多数记录在PeerGroup中都会有一个“匿名”值吗?如果是这样,并且CategoryId更有选择性,那么您可以在{CategoryIds:1, PeerGroup:1}上尝试一个索引(使用hint()来尝试一个索引而不是另一个)。
另外,为什么它会说“
:false”
这仅仅表明您希望返回的所有字段都不在索引中,而BtreeCursor则表明该索引已用于查询( BasicCursor将意味着它没有被使用)。要使这成为一个indexOnly查询,您需要在projection中只返回索引中的两个字段(即:{_id : 0, PeerGroup:1, CategoryIds:1})。这意味着它永远不需要接触数据本身,并且可以单独从索引返回所需的所有内容。
https://stackoverflow.com/questions/12226205
复制相似问题