MST

星途 面试题库

面试题:MongoDB在大数据场景下索引优化之复合索引策略

在大数据场景下,MongoDB的复合索引创建有哪些注意事项?请举例说明如何根据查询需求创建合理的复合索引以提升查询性能。
17.1万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

大数据场景下MongoDB复合索引创建的注意事项

  1. 索引字段顺序:复合索引中字段的顺序至关重要。最常使用的过滤条件字段应放在索引的最前面。例如,如果经常按 status 过滤文档,再按 createdAt 排序,那么复合索引应是 {status: 1, createdAt: 1},其中 1 表示升序,-1 表示降序。如果顺序错误,索引可能无法有效利用。
  2. 避免过度索引:创建过多的复合索引会占用大量的磁盘空间,并增加写操作的开销。因为每次写操作都可能需要更新索引。例如,在一个有大量插入操作的集合中,如果创建了过多不必要的复合索引,插入性能会显著下降。
  3. 考虑查询模式:复合索引应基于实际的查询模式来创建。如果有多种不同的查询模式,可能需要创建多个复合索引,但要权衡空间和性能的影响。
  4. 索引选择性:选择选择性高的字段放在索引前面。选择性高意味着该字段的值在集合中分布较为均匀,这样可以快速缩小查询范围。例如,在一个用户集合中,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_idorder_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 排序。