面试题答案
一键面试高基数字段索引策略
- 单独索引:高基数字段具有大量不同的值,适合创建单独的索引。例如,在一个存储用户信息的集合中,
email
字段通常是高基数的(每个用户的邮箱基本不同),可以为email
字段创建单独索引。
db.users.createIndex( { email: 1 } );
- 复合索引的前置字段:当需要创建复合索引时,高基数字段应放在复合索引的前面。例如,如果经常根据
email
和status
进行查询,email
是高基数字段,status
是低基数字段,复合索引应设计为{ email: 1, status: 1 }
。这样,MongoDB在查询时可以利用高基数email
字段的索引快速定位到较小的数据子集,然后再根据status
进行过滤。
低基数字段索引策略
- 复合索引后置:低基数字段值的种类较少,单独使用时索引效率不高。通常将其放在复合索引的后面。例如,在上述用户集合中,
status
字段(可能只有“active”、“inactive”等几个值)是低基数字段,在与email
创建复合索引时放在后面,如{ email: 1, status: 1 }
。 - 组合其他字段:可以与其他高基数字段或有区分度的字段组合成复合索引,提高索引的有效性。比如在一个订单集合中,
order_type
是低基数字段(如“online”、“offline”),order_id
是高基数字段,可创建复合索引{ order_id: 1, order_type: 1 }
,在查询订单时,如果根据order_id
和order_type
过滤,先通过order_id
快速定位,再通过order_type
进一步筛选。