Mongodb 是由时间戳+;搜索结果好吗?

Mongodb 是由时间戳+;搜索结果好吗?,mongodb,sharding,horizontal-scaling,Mongodb,Sharding,Horizontal Scaling,省基数较低且开始日期为时间戳的事件集合: { name: 'Party', province: 'Rome', start_date: 1369762458 } 我知道作为切分键的升序键不是一个好的选择,它会以一个热点结束(所有写入都会转到最后一个切分)。一个低基数又是一个糟糕的选择,因为我们最终会得到无法分解的块 那么,由开始日期+省制成的复合键是一个不错的选择?在这种情况下,为什么没有热点?使用开始日期,省会很糟糕,因为碎片键的第一部分会单调递增。但是,使用省、开始

基数较低且
开始日期
为时间戳的事件集合:

{
    name: 'Party',
    province: 'Rome',
    start_date: 1369762458
}
我知道作为切分键的升序键不是一个好的选择,它会以一个热点结束(所有写入都会转到最后一个切分)。一个低基数又是一个糟糕的选择,因为我们最终会得到无法分解的块


那么,由
开始日期
+
制成的复合键是一个不错的选择?在这种情况下,为什么没有热点?

使用开始日期,省会很糟糕,因为碎片键的第一部分会单调递增。但是,使用省、开始日期可能更好,并且“热点”问题会减少(尽管可能不会消除)


如果您同时有大量的写入,只要它们代表多个不同的省份,它们就会被定向到不同的块。如果一个省份的写操作数量不成比例,那么最终可能会出现一个热点(或热块),但是,只要您的写操作在多个省份之间有一个合理的分布(并且只要您有一个合理的省份数量,而不是两个或三个),您最终就会分布“热点”同样如此。

如果您的查询使用
开始日期
字段,它将起作用。有许多查询必须具有整个shard键才能工作,否则根本无法知道它应该转到哪个确切的shard。至于热点,这是因为现在分片键在两个省和开始日期之间是复合的,考虑到适当的平衡,因此没有真正的热点。我会查询给定省的很多事件,可能会按日期排序。然而,我无法理解复合键如何使热点不可能发生。有什么帮助吗?请看我的答案-您仍然可以在每个省份内获得热点,但如果您的数据代表多个省份,那么您可以通过在多个区块(按省份)之间拆分插入来缓解它,但通过使用复合碎片密钥来避免基数较低的不可拆分区块。不过,我想到了一件事,我必须承认,我不知道复合碎片键是如何在后台形成的,但如果它像一个复合索引一样,那么使用省不会首先导致低基数问题(如他的问题中所述)由于其重要性?当然不是-基数指的是整个切分键-您的基数是切分键可以有多少不同的不同值。因此,在切分集群中,
开始日期
的组合意味着可以有比
值更多的切分?因此,该键的使用方式如下:
{province:'rome',start_date:123}
而不是
{province:rome}
,然后
{start_date:123}
只需查看sh.status()输出即可。区块范围从{province:val,paymentID:val}到{province:val,paymentID:val2}复合键表示复合值。一个省可以用多个区块来表示,如果它的付款超过了一个区块所能容纳的金额。我想你的意思是“比省值更多的区块”,答案当然是“是”