面试题答案
一键面试- 字段顺序对查询性能的影响
- 前缀匹配原则:MongoDB复合索引遵循前缀匹配原则。即如果复合索引为
{field1: 1, field2: 1}
,那么查询{field1: value1}
可以使用该索引,而查询{field2: value2}
无法使用这个索引。因为只有以索引最左边字段开始的查询,才能利用到复合索引。 - 排序影响:如果查询中有排序操作,复合索引字段顺序与排序字段顺序一致时,能更高效地利用索引。例如,复合索引
{field1: 1, field2: 1}
,查询find().sort({field1: 1, field2: 1})
,MongoDB可以直接使用该索引进行排序操作,而不需要额外的排序阶段,大大提高查询性能。如果排序字段顺序与索引字段顺序不一致,如find().sort({field2: 1, field1: 1})
,索引可能无法被有效利用,导致性能下降。
- 前缀匹配原则:MongoDB复合索引遵循前缀匹配原则。即如果复合索引为
- 不同查询场景适合的复合索引字段顺序
- 场景一:范围查询在前,精确匹配在后
- 复合索引:假设我们有一个集合存储用户信息,包含
age
(年龄)和name
(姓名)字段。如果经常需要查询某个年龄段内的用户,并且对姓名进行过滤,复合索引{age: 1, name: 1}
会比较合适。 - 查询示例:
db.users.find({age: {$gte: 18, $lte: 30}, name: "John"})
。因为先对age
进行范围查询,然后对name
进行精确匹配,符合复合索引的前缀匹配原则,能够高效利用索引。
- 复合索引:假设我们有一个集合存储用户信息,包含
- 场景二:频繁排序查询
- 复合索引:若集合存储订单信息,包含
orderDate
(订单日期)和orderAmount
(订单金额)字段,并且经常需要按照订单日期升序,订单金额降序查询订单。复合索引{orderDate: 1, orderAmount: -1}
会比较合适。 - 查询示例:
db.orders.find().sort({orderDate: 1, orderAmount: -1})
。这样的索引字段顺序与排序顺序一致,能有效利用索引进行排序操作,提高查询性能。
- 复合索引:若集合存储订单信息,包含
- 场景一:范围查询在前,精确匹配在后