** 更新 **
我发布了一个答案,因为它已被确认是一个问题
** 原来的 **
首先,我很抱歉——我昨天才开始使用 MongoDB,对此我还是很陌生。我有一个非常简单的查询,使用 PHP 我的发现是这样的:
Mongo 版本是 2.0.4,在 CentOS 6.2 (Final) x64 上运行
$start = microtime(true);
$totalactive = $db->people->count(array('items'=> array('$gt' => 1)));
$end = microtime(true);
printf("Query lasted %.2f seconds\n", $end - $start);
没有索引,它返回:
Query lasted 0.15 seconds
我的数据库中有 280,000 条记录。所以我认为在“项目”上添加索引应该会有所帮助,因为我经常查询这些数据。但令我难以置信的是,在添加索引后,我得到了这个:
Query lasted 0.25 seconds
我做错什么了吗?
我用 find 而不是 count 来得到解释,这是输出:
> db.people.find({ 'items' : { '$gte' : 1 } }).explain();
{
"cursor" : "BtreeCursor items_1",
"nscanned" : 206396,
"nscannedObjects" : 206396,
"n" : 206396,
"millis" : 269,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" : {
"items" : [
[
1,
1.7976931348623157e+308
]
]
}
}
如果我将查询更改为“$ne”0,则需要多花 10 毫秒!
以下是收集统计数据:
> db.people.stats()
{
"ns" : "stats.people",
"count" : 281207,
"size" : 23621416,
"avgObjSize" : 84.00009957077881,
"storageSize" : 33333248,
"numExtents" : 8,
"nindexes" : 2,
"lastExtentSize" : 12083200,
"paddingFactor" : 1,
"flags" : 0,
"totalIndexSize" : 21412944,
"indexSizes" : {
"_id_" : 14324352,
"items_1" : 7088592
},
"ok" : 1
}
我有 1GB 的可用内存,所以我相信索引适合内存。
根据要求,这是人员索引:
> db.people.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "stats.people",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"items" : 1
},
"ns" : "stats.people",
"name" : "items_1"
}
]