面试题答案
一键面试常见陷阱
- 热点数据集中:如果片键选择不当,可能导致大量写操作集中在少数几个分片上,形成热点。例如,使用时间戳作为片键,如果数据按时间顺序写入,新数据会持续写入同一个分片。
- 低散列性:片键的取值分布不均匀,使得数据分布不均衡。比如使用状态字段作为片键,若该字段取值种类少,数据就无法均匀分布到各个分片。
- 片键更新困难:选择可更新的字段作为片键,更新片键值时,MongoDB需要将文档移动到新的分片,代价高昂且可能导致集群不稳定。
- 过小的片键基数:基数指片键的不同取值数量。基数过小,意味着数据集中在少数几个分片上,无法充分利用集群资源。
避免方法
- 使用复合片键:结合多个字段作为片键,例如结合时间戳和用户ID,让数据基于用户ID分散,同时保留时间顺序。
- 使用散列片键:对片键值进行散列处理,如对用户ID进行散列,确保数据均匀分布。可以使用MongoDB提供的
hashed
索引类型。 - 选择不可变字段:选择不会被更新的字段作为片键,如文档的唯一标识ID。
- 分析数据分布:在设计片键前,对数据进行分析,了解字段的取值分布情况,选择基数大且分布均匀的字段。