一、索引创建:聚焦查询需求与类型选择
在CentOS环境下优化MongoDB索引,精准识别高频查询字段是基础。通过分析应用查询模式(如登录时的username查询、商品列表的category+price筛选),优先为这些字段创建索引。对于单字段高频查询(如username),使用单字段索引(db.users.createIndex({username: 1}));对于多字段组合查询(如同时按username和age筛选),创建复合索引(db.users.createIndex({username: 1, age: -1})),注意字段顺序需匹配查询条件(如复合索引{a:1, b:1}无法优化b开头的查询)。此外,根据数据特性选择索引类型:文本搜索用文本索引(db.articles.createIndex({content: "text"}))、地理位置查询用2dsphere索引(db.locations.createIndex({coord: "2dsphere"}))、自动过期数据用TTL索引(db.sessions.createIndex({expireAt: 1}, {expireAfterSeconds: 3600}))。
二、索引优化:避免冗余与提升效率
db.collection.getIndexes()查看现有索引,删除未使用或重复的索引(如username和email都设为唯一索引时,若业务允许可合并为一个)。db.users.find({username: "admin"}, {username: 1, _id: 0})),可避免访问文档本身,显著提升查询速度。通过explain("executionStats")检查totalDocsExamined是否为0,确认是否为覆盖索引。db.collection.reIndex()重建索引,优化索引碎片(尤其是频繁更新的集合),提升索引读取效率。三、查询分析与监控:精准定位优化点
使用explain()方法分析查询计划,重点关注以下指标:
winningPlan中的stage为IXSCAN,说明使用了索引;若为COLLSCAN,则表示全表扫描,需优化索引。executionStats中的keysExamined(扫描的索引键数量)和docsExamined(扫描的文档数量)比值越大,说明索引效率越高;若keysExamined远大于nReturned(返回的文档数量),则索引可能不够精准。db.setProfilingLevel(1))记录慢查询日志(默认阈值100ms),分析慢查询的索引使用情况,针对性优化。四、硬件与配置:支撑索引性能的基础
/etc/mongod.conf中的storage.wiredTiger.engineConfig.cacheSizeGB调整缓存大小(如设置为8GB)。transparent_hugepage=never(修改/etc/default/grub后重启系统)。五、高级优化:针对复杂场景的策略
user_id),避免数据倾斜。background: true(后台创建索引,不影响业务)、unique: true(确保字段唯一性,如email)、sparse: true(仅索引包含该字段的文档,如phone字段可能为null)。hint()方法强制指定索引(如db.users.find({username: "admin"}).hint({username: 1})),但需谨慎使用(避免人为错误)。