所以我在 mongoDB 中有一个超级简单的数据库,其中有一些集合:
> show collections
Aggregates <-- count: 92
Users <-- count: 68222
Pages <-- count: 1728288847, about 1.1TB
system.indexes
The Aggregates
集合是集合的集合Pages
集合,每个文档如下所示:
> db.Aggregates.findOne()
{
"_id" : ObjectId("50f237126ba71610eab3aaa5"),
"daily_total_pages" : 16929799,
"day" : 21,
"month" : 9,
"year" : 2011
}
很简单。不过,让我们尝试通过添加所有 92 天来获得总页面加载量daily page loads
一起:
>>> def get_total():
... start = datetime.now()
... print sum([x['daily_total_pages'] for x in c.Aggregates.find()])
... end = datetime.now()
... print (end-start).seconds
...
>>> get_total()
1728288847
43
43秒?!?!?!?!
这 92 个合计结果很小!我还不如将它们存储在文本文件中,这太疯狂了。
或者它们很小?根据 mongo,它们在磁盘上有多大?
> db.Aggregates.stats()
{
"ns" : "c.AggregateResults",
"count" : 92,
"size" : 460250104,
"avgObjSize" : 5002718.521739131,
"storageSize" : 729464832,
"numExtents" : 7,
"nindexes" : 2,
"lastExtentSize" : 355647488,
"paddingFactor" : 1.0690000000000066,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"date_1" : 8176
},
"ok" : 1
}
每天这些微小的数字总计 438 MB?每一个大约为 280 字节,因此总共最多应为 25~30kb。所以存储巨大,查询超级慢。它有可能在磁盘上产生碎片吗?我将文档插入完整的文档后创建了聚合Pages
收藏。
有人对这种疯狂有任何见解吗? :哦
编辑:通过 Jared 更具体的 find() 查询解决了。 Sammaye 提供的下面的视频也提供了一些非常有趣的存储见解。
编辑2:所以我发现使用 sys.getsizeof() 是really找出文档大小的不可靠方法,因为它不会递归到任何树上。所以实际上我的文档非常大,最好的办法是使用 find({}, {'daily_page_loads'}) 作为更具体的查询!