MongoDB在Ubuntu上的索引优化策略
为经常用于查询条件的字段创建索引是提升查询性能的基础。例如,若频繁通过userid字段查询,可执行db.transactions.createIndex({userid: 1})(1表示升序索引)。需根据查询模式针对性创建,避免盲目添加索引。
userid字段);db.collection.createIndex({field1: 1, field2: -1}),-1表示降序),需将选择性高的字段(区分度高的字段)放在前面;tags数组),自动为数组每个元素创建索引;2dsphere索引用于地理位置数据)。通过explain()方法查看查询执行计划,确认索引是否被正确使用。例如,db.transactions.find({userid: 1}).explain('executionStats')可显示索引命中情况、扫描文档数、执行时间等指标,帮助识别索引未生效的问题。
每个索引都会增加写入操作的开销(如插入、更新时需同步更新索引)并占用存储空间。定期审查索引,删除不再使用的索引(可通过db.collection.dropIndex("indexName")删除)。
随着数据增长,索引可能产生碎片,影响查询性能。使用reindex()方法重建索引(如db.transactions.reIndex()),减少碎片并优化索引结构。
若查询的所有字段均包含在索引中,MongoDB可直接从索引中返回结果,无需访问原始文档(称为“覆盖查询”)。例如,若索引为{userid: 1, name: 1},查询db.transactions.find({userid: 1}, {name: 1, _id: 0})可使用覆盖索引,显著减少磁盘IO。
通过mongostat(监控操作速率)和mongotop(监控集合级读写时间)工具实时监控索引性能;也可使用第三方工具如Percona Monitoring and Management (PMM),获取更详细的索引使用率、慢查询等指标。
若数据量极大(如TB级别),单个节点无法承载,可使用MongoDB分片功能将数据分布到多个服务器。分片键需选择高频查询字段或基数高的字段(如userid),确保查询能均匀分布到各个分片。