优化查询语句
explain("executionStats")分析查询计划,确认是否使用了索引(避免COLLSCAN全表扫描)。例如,对常用查询字段(如user_id、status)创建单字段索引:db.collection.createIndex({ user_id: 1 })。limit()方法减少返回的文档数量,避免一次性传输大量数据。例如,db.collection.find({ status: "active" }).limit(100)。_id字段,除非必要),减少数据传输量。例如,db.collection.find({ category: "books" }, { title: 1, author: 1, _id: 0 })。$where子句(会触发JavaScript引擎执行,性能极差),改用索引支持的查询条件;避免对未索引字段进行排序(会导致SORT阶段全表扫描)。索引策略优化
find、sort、aggregate操作的字段创建索引。例如,对{ status: "active", create_time: -1 }的查询,创建复合索引{ status: 1, create_time: -1 }(选择性高的字段放前面)。{ a: 1, b: 2, c: { $gte: 1 } }.sort({ d: 1 }),应创建索引{ a: 1, b: 1, d: 1, c: 1 }(等值字段a、b在前,排序字段d其次,范围字段c最后)。{ name: 1, age: 1 },查询{ name: "Alice", age: 25 }且仅返回name、age字段时,可直接从索引获取数据(explain()中totalDocsExamined为0)。db.collection.aggregate([{ $indexStats: {} }])查看索引使用情况),减少写操作的开销(插入、更新、删除时需维护索引)。配置优化
storage.wiredTiger.engineConfig.cacheSizeGB参数(设置为物理内存的50%-75%),增加内存缓存数据和索引的比例,减少磁盘I/O。systemLog.verbosity(设为0,仅记录错误信息),减少日志写入频率;合理设置日志文件大小和滚动策略,避免频繁的磁盘I/O操作。net.maxIncomingConnections(默认10000,可根据并发连接数调整),避免过多连接导致资源竞争;设置operationProfiling.maxTimeMS(如100ms),监控慢查询。硬件优化
分片与副本集
user_id分片),实现水平扩展,提高查询和写入的并发能力。选择合适的分片键(如高基数的user_id,避免热点问题)。readPreference: "secondary"),减轻主节点的读取压力,提高读取性能。监控与维护
mongostat(监控QPS、延迟)、mongotop(监控集合级别的读写时间)、Prometheus+Grafana(可视化监控内存、CPU、磁盘I/O)等工具,实时监控数据库性能,及时发现瓶颈。slowms设为100ms),通过db.setProfilingLevel(2)记录慢查询,使用db.system.profile.find().sort({ ts: -1 }).limit(10)查看最近的慢查询,针对性优化。db.collection.reIndex()重建索引(清理碎片,提高索引效率);清理无用数据(如过期的日志、临时数据),减少数据量。