索引的核心作用是加速查询,但需根据实际查询场景选择合适的类型:
find、sort或aggregate的字段(如user_id、created_at)创建,支持精确匹配或范围查询。{ user_id: 1, created_at: -1 }),字段顺序需遵循“最左前缀原则”——查询条件需包含索引前缀字段(如user_id),才能有效利用索引。复合索引还能优化排序操作(如sort({ created_at: -1 }))。tags、comments)创建,支持数组元素的查询(如{ tags: "mongodb" })。content字段),支持多字段联合索引(如{ title: "text", description: "text" })。location字段),支持球面几何查询(2dsphere)或平面几何查询(2d)。phone字段可能为null),节省存储空间。email字段),防止数据重复。db.users.find({ user_id: 1 }, { user_id: 1, name: 1 })且索引为{ user_id: 1, name: 1 }),MongoDB可直接从索引读取数据,无需访问原始文档,大幅减少IO开销。user_id,值唯一或分布均匀)创建索引,能有效过滤数据;低选择性字段(如gender,值分布集中)创建索引效果有限。insert、update、delete)的开销(需维护索引结构),并占用更多磁盘空间。定期审查索引,删除不再使用的索引(如通过db.collection.getIndexes()查看未使用的索引)。db.collection.reIndex()命令重建索引(注意:重建索引会阻塞操作,建议在低峰期执行)。db.collection.aggregate([{ $indexStats: {} }])命令查看索引的使用频率(accesses.ops)、查询时间等指标,识别未使用或低效索引。storage.wiredTiger.engineConfig.cacheSizeGB)建议设置为系统内存的50%-80%,确保常用索引和数据能缓存在内存中,减少磁盘IO。vm.dirty_ratio、vm.dirty_background_ratio)控制脏页刷新频率,避免磁盘IO瓶颈;使用deadline或noop I/O调度器提升磁盘调度效率。mongostat实时查看查询负载(query列)、mongotop监控集合的读写时间(total列),快速定位高负载集合;启用慢查询分析(db.setProfilingLevel(1, { slowms: 100 })),通过db.system.profile.find()查看慢查询的执行计划(executionStats),识别未使用索引的查询。