选择合适的索引类型
根据查询场景选择索引类型是优化基础。单字段索引适用于单个字段的过滤或排序(如db.users.find({age: 25}));复合索引用于多字段组合查询,字段顺序需遵循“前缀匹配原则”(如{userId: 1, orderTime: -1}可支持find({userId: 123}).sort({orderTime: -1}),但find({orderTime: -1})无法使用该索引);多键索引自动为数组字段创建(如hobbies数组),支持数组元素查询;地理空间索引(2dsphere/2d)用于地理位置查询(如“附近商家”);文本索引用于字符串全文搜索(如$text: {$search: "coffee"}});哈希索引仅支持等值查询(如分片键常用)。
优化复合索引设计
复合索引是提升多字段查询性能的关键,需注意三点:
- 字段顺序:将过滤频率高、选择性高的字段放在前面(如
{userId: 1, orderTime: -1}中,userId的过滤频率通常高于orderTime); - 去除冗余:避免包含关系的索引(如已有
{a:1, b:1},则{b:1, c:1}无需单独创建,可通过调整查询使用前者); - 覆盖查询:若查询只需返回索引字段,可避免访问文档(如
explain()显示totalDocsExamined: 0即为覆盖查询)。
利用覆盖索引减少IO
覆盖索引直接从索引中返回结果,无需读取文档,能显著降低磁盘IO。例如,若查询find({age: 25}, {name: 1, age: 1}),可为age和name创建复合索引{age: 1, name: 1},此时explain()的totalDocsExamined为0,表示查询完全由索引覆盖。
避免过度索引
过多索引会增加写操作(插入、更新、删除)的开销(每个索引都需要维护),并占用更多磁盘空间。建议定期通过db.collection.getIndexes()审查索引,删除不再使用的索引(如通过db.collection.dropIndex("索引名"))。
定期维护索引性能
随着数据增删改,索引会碎片化,影响查询性能。需定期执行db.collection.reIndex()重建索引,优化索引结构。对于大型集合,可选择低峰期操作,减少对业务的影响。
使用explain分析查询计划
通过explain()方法(如explain("executionStats"))分析查询的执行计划,查看是否使用了索引(winningPlan中的inputStage是否为IXSCAN)、扫描的文档数(totalDocsExamined)、返回的文档数(totalKeysExamined)等指标,据此优化索引(如添加缺失的索引或调整查询条件)。
优化索引选择性
选择性高的字段(唯一值多)创建索引效果更好(如email字段的唯一值远多于gender字段)。优先为高选择性字段创建索引,能有效过滤数据,减少查询时间。
合理使用索引方向
索引方向(1为升序,-1为降序)需与查询需求一致。例如,若查询需按orderTime降序排序,应创建{orderTime: -1}的索引,避免索引反向扫描带来的性能损耗。
监控索引使用情况
通过db.collection.aggregate([{ $indexStats: {} }])监控索引的使用频率(accesses.ops表示索引被访问的次数)、最后一次访问时间(accesses.timestamp)等,及时删除未使用或很少使用的索引(如accesses.ops长期为0的索引)。
以上就是关于“MongoDB在Linux上的索引优化技巧”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm