** アップデート **
問題であることが確認されたので回答を投稿しました
** オリジナル **
まず、お詫び申し上げます。昨日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
私は何か間違ったことをしていますか?
countの代わりに、findを使用して説明を取得しました。これは出力です。
> 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のRAMを解放しているので、インデックスはメモリに収まると思います。
リクエストに応じて、ピープルインデックスは次のようになります。
> db.people.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "stats.people",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"items" : 1
},
"ns" : "stats.people",
"name" : "items_1"
}
]