创建合适索引优化查询性能
- 单字段索引:如果每个字段是独立被频繁查询,可分别为每个字段创建单字段索引。例如,假设集合
users
中有name
、age
、email
字段被频繁查询,在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);
- 复合索引:当多个字段经常在同一个查询条件中联合使用时,应创建复合索引。比如经常查询
age
大于某个值且email
匹配特定模式的文档,创建复合索引如下:
userSchema.index({ age: 1, email: 1 });
复合索引和单字段索引的应用及区别
- 应用
- 单字段索引:适用于单个字段独立查询的场景。例如,只根据
name
字段查询用户。
- 复合索引:适用于多个字段联合查询的场景。例如,电商系统中经常根据
category
和price
联合查询商品。
- 区别
- 查询性能
- 单字段索引:对于单个字段的查询有较好性能提升,但多个字段联合查询时,如果没有合适复合索引,可能需进行多次索引扫描和结果合并,性能不佳。
- 复合索引:能在联合查询时直接定位到符合条件文档,性能更优。但对于单个字段查询,如果复合索引中该字段不在最左前缀,索引可能无法充分利用。
- 索引存储开销
- 单字段索引:每个索引单独存储,占用较多存储空间。
- 复合索引:将多个字段组合在一个索引中,相比多个单字段索引,存储空间开销相对较小。
- 维护成本
- 单字段索引:插入、更新、删除操作时,每个单字段索引都可能需更新,维护成本较高。
- 复合索引:同样操作下,只需更新一个复合索引,维护成本相对低一些。