MongoDB 投影性能 - 还是只是许多小文档?
Posted
技术标签:
【中文标题】MongoDB 投影性能 - 还是只是许多小文档?【英文标题】:MongoDB Projection Performance - or just many small documents? 【发布时间】:2015-03-06 22:04:11 【问题描述】:我正在为用户设置/首选项和其他与用户相关的内容构建一个集合。
目前一个文档是这样的:
"_id": "USER_ID",
"setting1": "foo": "bar" ,
"setting2": true,
"setting3": "this might be a huuuuge email template",
...
我通过用户 ID 查询内容,然后使用投影来获取我需要的设置,即:
find( "_id":"USER_ID" , "setting2":1, "setting3":1 )
如果这样的文档会增长到 5 MB 并且有 500 个键怎么办?这仍然会表现良好吗?
或者我应该使用每个 USER_ID-SettingsKey-Tuple 的文档吗? (在user
和key
上有索引)即:
"_id":ObjectId("..."),
"user": "USER_ID",
"key": "setting1",
"value": "foo": "bar"
"_id":ObjectId("..."),
"user": "USER_ID",
"key": "setting2",
"value": true
...
然后用find(user:"USER_ID", key:$in:[setting1, setting2])
查询
对于每个用户的许多(和巨大的)设置,什么会表现得更好?
【问题讨论】:
【参考方案1】:嵌套更好。更少的文档 = 更高的性能。
为了获得最佳性能,我会将您的设置分成 22 个类别,每个类别有 22 个键,这样访问一个属性最多需要 22+22=44
步而不是 500 步。当然,如果在全部。
在这里插入关于过早优化的愚蠢引用
【讨论】:
是的,我实际上并没有遇到性能问题,因为测试设置只有 20 个用户,每个用户有 50 个设置。 但是如果我现在可以用 1 小时的努力把事情做好,我就不必在几个月内大发雷霆,然后必须转换数千个文档,等等。;)
。这个问题的主要原因是:也许在文档中找到一个键变得非常慢,所以投影变得非常慢。
它不是在文档中找到会很慢的键,而是在需要时将整个文档加载到内存中的所有 I/O 操作。我会默认使用您的第一个、最合乎逻辑的文档结构,然后看看您的内存/磁盘使用行为如何。以上是关于MongoDB 投影性能 - 还是只是许多小文档?的主要内容,如果未能解决你的问题,请参考以下文章