本文共 2375 字,大约阅读时间需要 7 分钟。
MongoDB 的索引机制与传统关系型数据库类似,旨在提升查询效率。索引可以帮助 MongoDB 通过限制文档扫描范围、快速定位所需数据来加快查询速度。此外,索引还支持排序操作,进一步优化查询结果的返回。
虽然索引能够显著缩短查询时间,但建立和维护索引也会消耗资源。尤其在高并发写入场景下,索引的更新会对性能产生负面影响。因此,在读操作少或不考虑读性能优化的情况下,建议避免过度使用索引。
MongoDB 支持多种索引类型,每种类型适用于不同的场景:
建立在单个字段上的索引,无需指定排序顺序,MongoDB 会自动选择优化的遍历路径。
复合索引由多个字段组成,按字段顺序进行排序。例如,索引 {userid: 1, score: -1}
会先按 userid
升序排序,接着在每个 userid
内按 score
降序排序。
适用于数组字段,MongoDB 为数组中的每个值创建索引,便于按数组元素值进行查询。
基于哈希值的索引,通常用于哈希分片集群,提升查询性能。
支持对字符串内容进行全文搜索,覆盖多个字段,但性能相对较低,建议谨慎使用。
基于经纬度的索引,适合进行2D或3D地理位置查询。
确保索引字段不存储重复值,避免文档中该字段出现冲突。
TTL(Time To Live)索引为文档设置过期时间,当达到指定时间后,文档会自动删除。适用于需要数据临时存储的场景。
复合索引的字段顺序对查询性能有直接影响。例如,索引 {userid: 1, score: -1}
会优先按 userid
升序排序,再按 score
降序排序。字段顺序决定了查询时的索引使用情况。
以下查询会使用复合索引:
db.s2.find().sort({ "userid": 1, "score": -1})
而以下查询则不会使用:
db.s2.find().sort({ "userid": 1, "score": 1})
通过 explain
分析查询执行计划,可以进一步了解索引的使用情况。
TTL 索引提供了文档过期机制,允许为每个文档指定过期时间 expireAfterSeconds
。当文档达到过期时间后,会被自动删除。
oplog
同步完成。_id
字段不支持 TTL 索引。TTL 索引适用于需要数据临时存储的场景,如日志、事件数据等,确保数据在一定时间内自动清理。
覆盖查询是指所有查询字段都是索引的一部分,并且结果字段也在同一索引中。此外,查询条件不能为 null
。
例如,创建联合索引 gender: 1, user_name: 1
,查询 db.users.find({gender: "M"}, {user_name: 1, _id: 0})
会覆盖该索引。
要确保查询字段均属于索引字段,且结果字段也在索引范围内。如果需要排除 _id
字段,需显式指定 _id: 0
。
复制集群(副本集)由主节点和从节点组成,主节点负责写操作,从节点负责读操作,确保集群在主节点故障时自动恢复。
主节点将写操作记录到 oplog
上限集合,From节点通过拉取 oplog
进行数据同步。
分片集群(Sharding)通过将数据分布到多个分片(Shard)中,解决副本集的性能瓶颈问题。
分片键决定数据分布的方式,需考虑取值基数、分布均匀性、查询特性和避免单调序列等因素。
分片集群通过 Chunk
实现数据存储,Chunk 是逻辑数据单元,按分片键范围划分数据。默认 Chunk 大小为 64MB,可自定义。
MongoDB 的索引和高可用性机制为用户提供了强大的数据管理能力。合理使用索引可以显著提升查询性能,而分片集群则能够应对大规模数据和高并发访问的挑战。理解和优化这些机制对于构建高性能 MongoDB 应用至关重要。
转载地址:http://onffk.baihongyu.com/