面试题答案
一键面试部分索引适用场景
- 稀疏数据场景:当集合中的文档某些字段存在大量缺失值时,创建普通索引会浪费空间且影响性能。例如在一个用户信息集合中,部分用户可能没有填写“爱好”字段,如果为“爱好”字段创建普通索引,会为每个文档在索引中占用空间,而部分索引仅会对存在“爱好”字段的文档创建索引,节省空间。
- 特定条件过滤场景:如果查询总是基于特定条件,比如查询状态为“已完成”的订单记录。通过创建基于“状态 = 已完成”条件的部分索引,可显著提高这类查询性能,而不会像普通索引那样对所有文档进行索引。
创建部分索引示例
假设我们有一个名为orders
的集合,包含order_status
和order_amount
字段。我们想为状态为“已完成”的订单创建部分索引,以优化对这类订单金额的查询。
db.orders.createIndex(
{ order_amount: 1 },
{ partialFilterExpression: { order_status: "已完成" } }
);
在上述代码中,{ order_amount: 1 }
指定了要索引的字段是order_amount
,partialFilterExpression
指定了部分索引的过滤条件,只有满足order_status
为“已完成”的文档才会被索引。
使用部分索引优化查询示例
继续以上面的orders
集合为例,当我们查询状态为“已完成”且订单金额大于100的订单时,部分索引就能发挥作用。
db.orders.find({
order_status: "已完成",
order_amount: { $gt: 100 }
});
由于我们创建了基于order_status
为“已完成”条件的部分索引,这个查询在扫描索引时只需遍历满足条件的文档索引,从而提高了查询性能。