【发布时间】:2017-07-06 09:11:17
【问题描述】:
一个 NoSQL 数据库 (MongoDB) 包含单个集合 - logs - 具有 10 亿个条目或一千个集合(logs_source0、logs_source1)之间的性能差异有多大?如果数据跨多个服务器分片,这种情况会改变吗?对象包含 6 到 10 个键,有时包含 3-5 个对象的数组。应用程序的设计可以使用其中任何一种,因为_sourceX 可以很容易地变成额外的密钥,反之亦然。
【问题讨论】:
一个 NoSQL 数据库 (MongoDB) 包含单个集合 - logs - 具有 10 亿个条目或一千个集合(logs_source0、logs_source1)之间的性能差异有多大?如果数据跨多个服务器分片,这种情况会改变吗?对象包含 6 到 10 个键,有时包含 3-5 个对象的数组。应用程序的设计可以使用其中任何一种,因为_sourceX 可以很容易地变成额外的密钥,反之亦然。
【问题讨论】:
只要所有数据都在一台服务器上,拥有一个大集合或许多小集合应该不会有太大的不同。与任何性能问题一样,彻底的答案必须考虑到您对该数据的预期用途。您是否经常访问所有这些数据?或者您是否有一个相对较小的工作数据集经常被访问,而其余的却很少被查看?
在有选择地将部分数据分页到内存中时,拥有许多小型集合可能会更好。当然,单个大集合也可以有选择地分页到内存中,但至少索引必须尽可能完全在内存中,以确保快速访问数据。对于许多较小的集合,这会更容易,因为每个集合都有自己的小索引。
但是,MongoDB 的分片旨在解决这个问题(维护大量数据),它通过将所有内容保存在一个逻辑集合中来实现这一点,但会自动将该集合分布到您喜欢的多个分片上。这比自己创建这些单独的集合要灵活得多。除其他外,它允许随着时间的推移重新平衡数据,以确保每个分片具有相同部分的数据。适应不同数量的分片也更灵活,而您的多收集方案似乎依赖于相当固定的数据分区(根据来源#)。
使用分片,应用程序将完全不知道分布模式,您可以透明地添加或删除任意数量的分片,以处理大量数据。
【讨论】: