这可能比其他任何建议都更重要,但我正在设计一个应用程序,该应用程序存储在具有 2dsphere 索引并且它们也有日期(+时间)的表对象中,它们都是我查询的一部分正在检索其中一些对象。
这个数据库必须被分片,所以根据空间键分片听起来像是第一步。基本上,这个索引将成为分片键的一部分。另一个关键应该是时间,我很确定散列时间是不够的,因为查询正在寻找对象的日期间隔。所以散列将强制访问所有块(具有适当的空间约束),这是我不想要的。
所以我的问题是知道这是否可行,以及除非我手动要求,否则 mongodb 是否足够聪明,不会根据空间键进行拆分?
分片键索引不能是多键、文本或地理空间,因此您的部分理论方法肯定是不可行的。您还提到考虑在日期时间字段上进行散列分片,这可以为其他单调递增的值(如时间戳)提供更好的数据分布。但是,权衡是散列分片不支持范围查询,因为相邻的源值现在将具有分布式分片键值。
由于分片键不能是数组或地理空间值,因此这个特定问题并不真正适用。
MongoDB 分片的默认行为是允许自动发生分片键范围拆分(也称为“块拆分”),以便分片集群平衡器根据块不平衡在分片之间重新分配数据。可以调整默认行为(例如,禁用集群的自动拆分或集合的平衡),但您应该谨慎考虑这样做。对分片集群进行微观管理可能会适得其反。