MST

星途 面试题库

面试题:MongoDB文档索引优化策略

假设在MongoDB中有一个包含大量文档的集合,每个文档有多个字段,现在需要对其中几个字段进行频繁查询。请说明如何为这些字段创建合适的索引以优化查询性能,并解释复合索引和单字段索引在这种场景下的应用及区别。
19.9万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

创建合适索引优化查询性能

  1. 单字段索引:如果每个字段是独立被频繁查询,可分别为每个字段创建单字段索引。例如,假设集合users中有nameageemail字段被频繁查询,在Node.js中使用mongoose库为例创建单字段索引代码如下:
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
  name: String,
  age: Number,
  email: String
});
userSchema.index({ name: 1 });
userSchema.index({ age: 1 });
userSchema.index({ email: 1 });
const User = mongoose.model('User', userSchema);
  1. 复合索引:当多个字段经常在同一个查询条件中联合使用时,应创建复合索引。比如经常查询age大于某个值且email匹配特定模式的文档,创建复合索引如下:
userSchema.index({ age: 1, email: 1 });

复合索引和单字段索引的应用及区别

  1. 应用
    • 单字段索引:适用于单个字段独立查询的场景。例如,只根据name字段查询用户。
    • 复合索引:适用于多个字段联合查询的场景。例如,电商系统中经常根据categoryprice联合查询商品。
  2. 区别
    • 查询性能
      • 单字段索引:对于单个字段的查询有较好性能提升,但多个字段联合查询时,如果没有合适复合索引,可能需进行多次索引扫描和结果合并,性能不佳。
      • 复合索引:能在联合查询时直接定位到符合条件文档,性能更优。但对于单个字段查询,如果复合索引中该字段不在最左前缀,索引可能无法充分利用。
    • 索引存储开销
      • 单字段索引:每个索引单独存储,占用较多存储空间。
      • 复合索引:将多个字段组合在一个索引中,相比多个单字段索引,存储空间开销相对较小。
    • 维护成本
      • 单字段索引:插入、更新、删除操作时,每个单字段索引都可能需更新,维护成本较高。
      • 复合索引:同样操作下,只需更新一个复合索引,维护成本相对低一些。