面试题答案
一键面试索引与数据持久性的关系
在MongoDB中,索引本身并不直接优化数据持久性。数据持久性主要通过MongoDB的存储引擎(如WiredTiger)、日志机制(如oplog)以及副本集等功能来保证。然而,合理设计索引可以通过提升查询性能,间接减少因查询压力过大导致的潜在数据操作风险,保障数据持久化过程的稳定性。
不同类型查询场景下索引的设计要点
- 单字段精确查询
- 场景:例如根据用户ID查询用户信息,
db.users.find({userId: "12345"})
。 - 设计要点:为
userId
字段创建单字段索引。
db.users.createIndex({userId: 1});
- 解释:1表示升序索引,MongoDB可以快速定位到匹配
userId
的文档,大大提升查询效率。
- 场景:例如根据用户ID查询用户信息,
- 范围查询
- 场景:查询成绩在80到90分之间的学生,
db.students.find({score: {$gte: 80, $lte: 90}})
。 - 设计要点:为
score
字段创建单字段索引。
db.students.createIndex({score: 1});
- 解释:索引可以帮助MongoDB快速定位到满足范围条件的文档,而无需全表扫描。
- 场景:查询成绩在80到90分之间的学生,
- 多字段组合查询
- 场景:根据城市和年龄范围查询居民,
db.residents.find({city: "Beijing", age: {$gte: 30, $lte: 40}})
。 - 设计要点:创建复合索引,索引字段顺序要与查询条件中的字段顺序一致(通常按照过滤性强的字段在前的原则)。
db.residents.createIndex({city: 1, age: 1});
- 解释:MongoDB先按
city
过滤,再按age
过滤,复合索引能有效支持这种查询顺序,提高查询性能。
- 场景:根据城市和年龄范围查询居民,
- 排序查询
- 场景:按照注册时间降序查询用户,
db.users.find().sort({registerTime: -1})
。 - 设计要点:为
registerTime
字段创建与排序方向一致的索引。
db.users.createIndex({registerTime: -1});
- 解释:索引的排序方向与查询排序方向一致,可避免MongoDB额外的排序操作,提升查询速度。
- 场景:按照注册时间降序查询用户,
- 地理空间查询
- 场景:查询距离某个坐标点一定范围内的店铺,
db.shops.find({location: {$near: [longitude, latitude], $maxDistance: distance}})
,其中location
字段为GeoJSON格式。 - 设计要点:创建地理空间索引。
db.shops.createIndex({location: "2dsphere"});
- 解释:
2dsphere
类型的索引专门用于地理空间查询,能高效处理球面几何相关的查询。
- 场景:查询距离某个坐标点一定范围内的店铺,