MST

星途 面试题库

面试题:MongoDB Shell客户端下复杂查询与索引优化

在MongoDB Shell中,给定一个具有多个字段的集合,需求是查询满足多个条件(例如多个字段的范围查询且存在嵌套文档条件)的数据。请编写查询语句,并分析如何通过创建合适的索引来优化此查询性能,说明索引的类型及原因。
14.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

查询语句示例

假设集合名为students,包含字段age(年龄)、score(分数)和嵌套文档address(地址,其中有city城市字段)。要查询年龄在18到25岁之间,分数大于80分,且地址城市为"Beijing"的学生数据。

db.students.find({
    age: { $gte: 18, $lte: 25 },
    score: { $gt: 80 },
    "address.city": "Beijing"
});

索引优化

  1. 复合索引:创建一个复合索引,将查询中涉及的字段组合在一起。
db.students.createIndex({ age: 1, score: 1, "address.city": 1 });
  • 原因:复合索引可以同时利用多个字段进行查询优化。在这个查询中,复合索引能够按照索引定义的字段顺序依次过滤数据,减少全表扫描的开销。MongoDB在使用复合索引时,会尽量使用索引的最左前缀原则,所以将最常使用的过滤条件放在索引的最左边,能更有效地利用索引。
  1. 单字段索引:也可以考虑对每个字段分别创建单字段索引。
db.students.createIndex({ age: 1 });
db.students.createIndex({ score: 1 });
db.students.createIndex({ "address.city": 1 });
  • 原因:单字段索引对于只涉及单个字段的查询也有一定优化作用。如果应用场景中除了上述复杂查询外,还有一些只基于单个字段的查询,单字段索引能提高这些查询的性能。但相比复合索引,在处理多条件联合查询时,单字段索引的性能提升不如复合索引,因为MongoDB在使用多个单字段索引时,可能无法像使用复合索引那样高效地组合过滤条件。