Debian环境下MongoDB索引优化技巧
mongostat、mongotop或explain()输出),识别高频查询字段(如username、status、createTime),为其创建针对性索引。例如,若应用频繁通过username查询用户信息,可执行db.users.createIndex({ username: 1 })。status(选择性高,如“paid”订单占比低)和createTime(范围查询),应创建db.orders.createIndex({ status: 1, createTime: -1 }),而非{ createTime: -1, status: 1 }。text索引(如db.blog.createIndex({ title: "text", content: "text" }))、地理位置查询用2dsphere索引(如db.locations.createIndex({ coordinates: "2dsphere" }))、自动过期数据用TTL索引(如db.sessions.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 }))。username和email,可创建复合索引db.users.createIndex({ username: 1, email: 1 }),此时查询db.users.find({ username: "Alice" }, { email: 1, _id: 0 })可直接从索引获取数据,无需读取文档。explain("executionStats")分析查询计划,确认是否使用了索引(winningPlan.inputStage.stage应为IXSCAN而非COLLSCAN);避免大范围查询(如无索引的$gt/$lt条件);使用投影({ field: 1, _id: 0 })限制返回字段,减少数据传输量。reIndex()方法重建索引(如db.users.reIndex()),或在低峰期执行compact命令压缩数据文件(如db.runCommand({ compact: 'users' }))。db.collection.stats()查看索引大小、使用次数(indexDetails.<indexName>.accesses.ops);使用db.currentOp()监控慢索引操作;定期删除未使用的索引(如30天内未被查询的索引),减少写操作开销(每个索引都会增加插入、更新、删除的时间)。/etc/mongod.conf文件,优化以下参数——storage.wiredTiger.engineConfig.cacheSizeGB(设置为物理内存的50%-70%,用于缓存数据和索引)、net.maxIncomingConnections(根据并发连接数调整,默认10000,避免过多连接导致资源竞争)。_id、user_id或复合键{ user_id: 1, createTime: 1 }),确保分片键具有高基数(唯一值多)和均匀分布。readPreference: "secondaryPreferred"),减轻主节点的读取压力,提升整体查询吞吐量。