MongoDB在Ubuntu上的索引优化方法
导读:MongoDB 在 Ubuntu 上的索引优化方法 一 索引类型与创建要点 常用索引类型与适用场景 单字段索引:适用于按某一字段高频查询,如按 username 精确查找。 复合索引:多条件组合查询,遵循“等值在前、范围在后”的顺序,如...
MongoDB 在 Ubuntu 上的索引优化方法
一 索引类型与创建要点
- 常用索引类型与适用场景
- 单字段索引:适用于按某一字段高频查询,如按 username 精确查找。
- 复合索引:多条件组合查询,遵循“等值在前、范围在后”的顺序,如 { status: 1, created_at: -1} 。
- 文本索引:用于全文检索,如 { description: “text”} ,支持多字段权重。
- 地理空间索引:球面数据用 2dsphere,平面数据用 2d。
- 哈希索引:对字段做哈希,适合分片键的均匀分布,如 { field: “hashed”} 。
- 基本操作
- 创建索引:
db.collection.createIndex({ field: 1 } );复合索引:db.collection.createIndex({ a: 1, b: -1 } );唯一索引:db.collection.createIndex({ email: 1 } , { unique: true } );文本索引:db.collection.createIndex({ title: "text", body: "text" } );哈希索引:db.collection.createIndex({ userId: "hashed" } )。 - 查看索引:
db.collection.getIndexes();删除索引:db.collection.dropIndex("indexName")或db.collection.dropIndexes()。 - 索引选项:常用有 unique、sparse、background、name、expireAfterSeconds、weights;创建后台索引避免阻塞业务:
db.collection.createIndex({ field: 1 } , { background: true } )。
- 创建索引:
二 查询与索引设计原则
- 复合索引顺序要与查询的 等值条件 → 排序 → 范围 一致,才能被高效利用。
- 覆盖索引:将查询与投影字段全部包含在索引中,避免回表,如
db.users.createIndex({ username: 1, status: 1, age: 1 } ),查询只返回这些字段即可走覆盖索引。 - 避免全表扫描:确保查询条件能命中索引;必要时使用 hint 临时指定索引进行验证。
- 分页优化:对
sort + skip/limit分页,务必在排序列上建立索引,否则深分页性能急剧下降。 - 聚合管道尽早过滤:在
$match阶段使用索引减少后续处理的数据量。 - 控制索引数量:索引提升读性能但增加写开销与存储占用,只为高频、必要的查询建索引。
三 监控分析与维护
- 使用 explain(“executionStats”) 检查是否命中索引、扫描文档数与执行时间:
db.orders.find({ status: "A", total: { $gte: 100 } } ).sort({ created_at: -1 } ).explain("executionStats")。 - 启用慢查询日志定位问题查询,配合 mongostat、mongotop 观察操作与资源使用趋势。
- 定期审计索引使用与集合统计:
db.collection.stats()可查看索引大小与使用情况,识别低效或冗余索引。 - 索引碎片治理:在大量更新/删除后,必要时执行 reIndex 重建索引以降低碎片(维护窗口内执行)。
- 批量导入场景:先移除/延迟非必要索引,导入完成后再批量创建,显著提升写入吞吐。
四 Ubuntu 系统层面的优化配合
- 禁用透明大页(THP):创建 systemd 服务设置
echo never > /sys/kernel/mm/transparent_hugepage/enabled,减少内存管理开销,提升数据库稳定性与性能。 - 资源与连接限制:在
/etc/security/limits.d/mongodb.conf提升 nofile/nproc,如mongod soft/hard nofile 64000、mongod soft/hard nproc 64000,避免连接耗尽。 - 存储与缓存:优先使用 SSD;在
/etc/mongod.conf中合理设置 storage.wiredTiger.engineConfig.cacheSizeGB,通常将可用内存的 70%–80% 分配给 WiredTiger 缓存(结合实例总内存与系统需求)。 - 监控工具:结合 mongostat、mongotop 与第三方监控(如 PMM)持续观察索引与查询表现,形成闭环优化。
五 实用索引策略清单
- 高频精确查询字段建立 单字段索引;多条件组合建立 复合索引 并遵循“等值 → 排序 → 范围”的顺序。
- 只读报表/明细查询尽量设计 覆盖索引,减少磁盘与内存访问。
- 全文搜索使用 文本索引 并设置权重;地理空间查询使用 2dsphere/2d。
- 需要均匀分布写入与分片的场景使用 哈希索引 作为分片键(或配合复合键)。
- 对大文本模糊查询尽量避免前导通配(如
^term),优先使用 文本索引 或其他检索方案。 - 建立 TTL 索引 自动清理过期数据,减少维护成本与空间占用。
- 定期使用 explain 与慢查询日志复盘索引效果,删除长期未使用或低效索引,保持索引集精简高效。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: MongoDB在Ubuntu上的索引优化方法
本文地址: https://pptw.com/jishu/748782.html
