1 概述
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。 索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB还可以使用索引中的排序返回排序结果。 MongoDB索引使用B树数据结构(确切的说是B-Tree,MySQL是B+Tree)
官网文档:https://docs.mongodb.com/manual/indexes/
索引的核心价值
索引作为MongoDB查询引擎的加速器,通过构建高效数据访问路径实现性能跃升。在无索引场景下,数据库需执行全集合扫描(Collection Scan),其时间复杂度为O(n),在亿级数据集上可能导致分钟级响应延迟。通过索引可将查询复杂度优化至O(log n),实现毫秒级响应。
2 索引类型矩阵
2.1 单字段索引(Single Field Index)
定义:基于单一字段创建的升序(1)或降序(-1)索引
特性:
查询优化:支持精确匹配(eq)和范围查询(gt/$lt等)
排序兼容性:索引方向不影响排序操作,MongoDB可双向遍历索引
存储优化:通过前缀压缩技术减少存储空间占用
适用场景:高频查询的单字段过滤条件
2.2 复合索引(Compound Index)
定义:基于多个字段组合的索引,字段顺序决定索引层级结构
核心原则:
最左前缀原则:查询条件需包含索引前缀字段才能触发索引使用
排序优化:索引字段顺序需与查询排序字段顺序一致
性能优势:
覆盖查询:当查询字段完全包含在索引中时,可避免回表查询
多条件过滤:显著提升多字段AND/OR查询效率
示例解析:
javascript
// 索引 { userid:1, score:-1 }
db.users.find({ userid: 1001 }) // 触发索引
db.users.find({ score: { $gt: 90 } }) // 不触发索引
db.users.find().sort({ userid:1, score:-1 }) // 完全利用索引排序
2.3 专业索引类型
地理空间索引(Geospatial Index)
类型体系:
2d索引:平面坐标系,适用于地图应用
2dsphere索引:球面坐标系,支持GeoJSON数据
查询能力:
邻近查询:near/nearSphere
几何运算:geoWithin/geoIntersects
应用场景:LBS服务、地理位置分析
文本索引(Text Index)
处理机制:
词干提取:将"running"转为"run"
停用词过滤:自动忽略高频无意义词汇
多语言支持:通过权重配置优化多语言搜索
查询操作符:
$text:全文搜索
$regex:正则表达式匹配(需配合索引使用)
哈希索引(Hashed Index)
设计目的:
分片键优化:实现数据均匀分布
加密字段查询:支持哈希值精确匹配
使用限制:
仅支持$eq查询,不支持范围查询和排序操作
典型场景:用户密码哈希值存储与验证
性能调优建议:使用explain()分析查询执行计划,通过createIndex()指定背景建索引避免锁表,监控索引使用率,定期清理冗余索引,
复合索引字段顺序遵循"高频优先+排序字段后置"原则
通过合理选择索引类型和优化索引结构,可使MongoDB查询性能提升数个数量级,建议参考
官方索引文档进行深度调优。