面试题答案
一键面试片键选择对数据在分片上分布的影响
- 均匀分布:如果片键选择得当,数据能够均匀地分布在各个分片上。例如选择具有高基数(即包含大量不同值)且分布较为均匀的字段作为片键,如电商系统中订单表的“订单创建时间戳”,随着时间不断有新订单生成,这个字段的值不断变化且分布相对均匀,MongoDB可以根据这个片键将订单数据比较均衡地分配到各个分片,从而充分利用集群资源,提高读写性能。
- 不均匀分布:若片键选择不当,可能导致数据倾斜。比如选择一个低基数的字段,像电商系统订单表中“订单状态”(可能只有“待支付”“已支付”“已取消”等有限几个状态)作为片键,大部分数据可能集中在某一个或几个分片上,而其他分片数据量极少,使得集群资源无法充分利用,读写性能下降。
示例
假设有一个包含学生信息的集合,结构如下:
{
"name": "张三",
"age": 20,
"class": "一班",
"score": 85
}
- 选择“age”作为片键:由于年龄取值范围相对有限(假设学生年龄在15 - 25岁之间),数据可能不会均匀分布。例如,18岁和19岁的学生较多,这部分数据可能集中在少数几个分片上,导致数据倾斜。
- 选择“name”作为片键:学生姓名具有较高基数,每个学生姓名大概率不同,因此以“name”作为片键时,数据更有可能均匀地分布在各个分片上,能够更好地利用分片集群的资源。