面试题答案
一键面试大数据场景下MongoDB复合索引创建的注意事项
- 索引字段顺序:复合索引中字段的顺序至关重要。最常使用的过滤条件字段应放在索引的最前面。例如,如果经常按
status
过滤文档,再按createdAt
排序,那么复合索引应是{status: 1, createdAt: 1}
,其中1
表示升序,-1
表示降序。如果顺序错误,索引可能无法有效利用。 - 避免过度索引:创建过多的复合索引会占用大量的磁盘空间,并增加写操作的开销。因为每次写操作都可能需要更新索引。例如,在一个有大量插入操作的集合中,如果创建了过多不必要的复合索引,插入性能会显著下降。
- 考虑查询模式:复合索引应基于实际的查询模式来创建。如果有多种不同的查询模式,可能需要创建多个复合索引,但要权衡空间和性能的影响。
- 索引选择性:选择选择性高的字段放在索引前面。选择性高意味着该字段的值在集合中分布较为均匀,这样可以快速缩小查询范围。例如,在一个用户集合中,
email
字段的选择性通常比gender
字段高。
根据查询需求创建合理复合索引提升查询性能的示例
假设有一个电商订单集合 orders
,包含字段 customer_id
(客户ID)、order_status
(订单状态)、order_date
(订单日期)和 total_amount
(订单总金额)。
需求1:查询特定客户且特定状态的订单,按订单日期排序
db.orders.find({customer_id: "12345", order_status: "completed"}).sort({order_date: 1});
应创建复合索引:
db.orders.createIndex({customer_id: 1, order_status: 1, order_date: 1});
这样的索引顺序可以满足先根据 customer_id
和 order_status
过滤,再按 order_date
排序的需求。
需求2:查询订单金额大于某个值且按订单日期排序
db.orders.find({total_amount: {$gt: 100}}).sort({order_date: 1});
可创建复合索引:
db.orders.createIndex({total_amount: 1, order_date: 1});
先通过 total_amount
过滤,再按 order_date
排序。