我创建了一个巨大的 mongodb 数据库。以下是它的统计数据:
> db.stats() <br/>
{
"db" : "test-sample-db",
"collections" : 3,
"objects" : 30700242,
"avgObjSize" : 607.1807849592847,
"dataSize" : 18640597036,
"storageSize" : 19531558816,
"numExtents" : 31,
"indexes" : 2,
"indexSize" : 2692111520,
"fileSize" : 25691160576,
"nsSizeMB" : 16,
"dataFileVersion" : {
"major" : 4,
"minor" : 5
},
"ok" : 1
}
我在 Windows 7(64 位)(8 GB RAM)python 2.7 上使用 pymongo 来查询这个数据库。请注意,索引是在名为“key”的字段上创建的。查询很简单,我只想要所有具有指定键的文档。我为此使用了 $in,如下所示:
result = testdb.find({"key": {"$in":lt}})
for doc in result:
pass
上面“lt”的大小约为 1000。因此,此查询将在 amx 返回 1000 个文档。我注意到这个查询很慢。执行此查询并遍历游标大约需要 5-6 秒,如上面的代码所示。有什么办法可以优化它以使此操作更快吗?
样本文件:
{"key" : "abcd12xx", "data" : {"w1" : 1, "w3": 1, "w4" : 3}}
query.explain() 的输出(并不是说这里只有 10 个键来节省空间。通常我会有 1000 个键,因此会更大):
{ u'nYields': 0,
u'nscannedAllPlans': 19,
u'allPlans': [{u'cursor': u'BtreeCursor feature_1 multi',
u'indexBounds': {u'feature': [[u'1000', u'1000'], [u'1001', u'1001'],
[u'1002', u'1002'], [u'1003', u'1003'], [u'1004', u'1004'],
[u'1005', u'1005'], [u'1006', u'1006'], [u'1007', u'1007'],
[u'1008', u'1008'], [u'1009', u'1009']]
},
u'nscannedObjects': 10,
u'nscanned': 19,
u'n': 10}],
u'millis': 0,
u'nChunkSkips': 0,
u'server': u'server:27017',
u'n': 10,
u'cursor': u'BtreeCursor feature_1 multi'
}