面试题答案
一键面试考虑因素
- 选择性:部分索引应基于能有效过滤数据的字段创建。若选择性差,查询性能提升有限,还增加更新开销。例如,若集合中有“status”字段,且大部分查询基于“status = 'active'”,基于此创建部分索引可大幅提升查询性能。
- 更新频率:对于频繁更新的集合,更新操作涉及索引维护。若索引字段更新频繁,每次更新都要调整索引结构,开销大。比如“last_modified”字段经常更新,基于它创建部分索引会增加更新负担。
- 数据分布:了解数据在字段上的分布情况很重要。若数据分布不均,部分索引可能无法覆盖大部分查询场景。例如“region”字段,若90%的数据集中在一个地区,基于该字段创建部分索引对其他地区查询无帮助。
- 查询模式:需明确常见查询模式。若主要查询按时间范围查询,部分索引应基于时间字段构建,否则无法优化查询。
解决方案
- 选择合适字段:基于高选择性、更新频率低且符合查询模式的字段创建部分索引。如日志集合,查询常按“severity”(严重程度)和“timestamp”,且“severity”更新少,可基于此创建部分索引。
- 调整索引粒度:可根据数据分布调整部分索引粒度。若数据分布不均,可创建更细粒度索引,如分桶索引。比如按地区分桶,每个桶建部分索引。
- 定期维护:定期评估部分索引有效性,删除不再优化查询或增加过多更新开销的索引。如业务变化后,原部分索引不再适用,应及时删除。
- 组合索引:结合多个字段创建组合部分索引,覆盖多种查询模式。例如结合“user_type”和“login_time”创建组合部分索引,满足按用户类型和登录时间的查询。