减少集合数量
Overview
集合是 MongoDB 文档的分组,类似于 RDBMS表。 集合存在于单个数据库中。
即使集合不包含任何文档,它仍然会以不可删除的默认 _id 索引的形式产生资源成本。 尽管此索引本身不会占用太多空间(尤其是对于小型集合),但如果您有数千个集合,这些索引会增加资源并增加数据库分配的压力。
如果您的部署包含不必要的collection或数量不断增加,则应考虑重组数据以减少collection数量,最终降低应用程序的资源需求。
例子
考虑一个 temperatures
数据库,其中存储了从传感器获得的温度collection集合。从上午 10 点到晚上 10 点,传感器每半小时读取一次读数。 每天的读数都存储在一个单独的collection中,并以读数日期命名:
// temperatures.march-09-2020 { "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 }
// temperatures.march-10-2020 { "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
数据库中集合的数量与日俱增。 由于集合的数量没有限制,因此数据库对维护这些集合及其相应索引的需求不断增长。 如果数据库最终达到管理数千个集合和索引的地步,则可能会导致性能下降。
此外,此方法不容易促进跨多天的查询。如要查询多天的数据以获得更长时期内的温度趋势,您需要执行 $lookup
操作,其性能不如查询同一集合中的数据。
更新模式
相反,构建此数据的更好方法是将所有温度读数存储在单个collection中,并将每天的读数存储在单个文档中。考虑这个更新后的模式,其中所有温度都在单个集合中: temperatures.readings
:
// temperatures.readings { "_id": ISODate("2020-03-09"), "readings": [ { "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 }, { "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 }, ... { "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } ] } { "_id": ISODate("2020-03-10"), "readings": [ { "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 }, { "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 }, ... { "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 } ] }
与原始模式相比,更新后的模式所需的资源少得多。 现在,该collection上的默认_id
索引有助于简化按日期进行的查询,而不是要求为读取温度的每一天都建立索引。
如何检查不必要的collection
MongoDB Shell (mongosh
)
要检查数据库中的集合数,可以从 mongosh
运行以下命令:
db.getCollectionNames().length
db.stats()方法还返回数据库中集合的数量,以及有用的数据库统计信息,例如数据和索引的总大小。
MongoDB Ops Manager
数据资源管理器
MongoDB Ops Manager 数据浏览器提供数据库中集合的高级概览。 数据浏览器显示集合的总大小,包括集合索引的大小。 如果集合的大部分大小由索引组成,则可以考虑将该集合的数据合并到另一个集合中,并删除原始集合。 有关将数据从一个集合合并到另一个集合的方法,请参阅$merge
文档。
此外,如果数据浏览器显示有空集合,则可以直接从数据浏览器中删除这些集合。
实时性能面板
Ops Manager实时性能面板会显示哪些collection的活动最多。您可以使用此工具在删除集合之前确保应用程序没有主动使用该集合。
了解详情
要了解有关 MongoDB 数据建模和灵活的模式模型的更多信息,请参阅数据建模简介。
要了解有关数据库和集合的更多信息,请参阅数据库和集合。
要了解有关在单个文档中嵌入相关数据的更多信息,请参阅嵌入式数据模型
MongoDB.live 2020 演讲
要了解如何将灵活数据模型整合到您的架构中,请参阅 MongoDB.live 2020 中的以下演示文稿:
通过 MongoDB 数据建模了解 MongoDB 中的实体关系及其实现示例。
通过高级模式设计模式了解您可以整合到模式的高级数据建模设计模式。