面试题答案
一键面试索引选择策略
- 分析查询模式:
- 深入了解应用程序的查询需求,使用
explain
命令分析常见查询,明确哪些字段频繁用于过滤、排序或连接操作。例如,对于按时间范围查询日志数据的场景,将时间字段作为索引的一部分。 - 关注读写比例,对于读多写少的场景,可以适当增加索引以提升查询性能;而对于写多的场景,要谨慎添加索引。
- 深入了解应用程序的查询需求,使用
- 复合索引:
- 当多个字段经常一起用于查询时,创建复合索引。注意字段顺序,将选择性高(离散度大)的字段放在前面。比如,在用户表中,若经常按
country
和city
查询,且country
离散度大,应创建{country: 1, city: 1}
的复合索引。 - 避免过度创建复合索引,防止索引膨胀导致维护成本过高。
- 当多个字段经常一起用于查询时,创建复合索引。注意字段顺序,将选择性高(离散度大)的字段放在前面。比如,在用户表中,若经常按
索引创建策略
- 分批创建:
- 在高并发环境下,一次性创建大量索引可能导致长时间锁表,影响业务操作。因此,可以分批创建索引,每次创建少量索引,减少对系统的冲击。
- 选择业务低峰期进行索引创建操作,降低对正常业务的影响。
- 后台创建:
- 使用
background: true
选项在后台创建索引,这样不会阻塞其他读写操作。例如,db.collection.createIndex({field: 1}, {background: true})
。
- 使用
索引调整策略
- 定期评估:
- 随着数据的增长和业务需求的变化,定期使用
db.collection.totalIndexSize()
查看索引占用空间,结合查询性能监控,评估现有索引是否仍满足需求。 - 对于很少使用的索引,及时删除以减少维护成本。可通过
db.currentOp()
查看正在执行的操作,确认索引是否被频繁使用。
- 随着数据的增长和业务需求的变化,定期使用
- 动态调整:
- 根据业务流量的动态变化,灵活调整索引。例如,在促销活动期间,某些特殊查询的频率增加,可临时创建相应索引,活动结束后删除。
监控策略
- 性能指标监控:
- 使用MongoDB自带的监控工具,如
mongostat
实时查看服务器的读写操作、索引使用情况等指标。关注qr|qw
(读队列和写队列长度),若队列长度持续增长,可能表示索引性能问题。 top
命令可用于监控系统资源使用情况,特别是CPU和内存,索引维护可能消耗大量资源。
- 使用MongoDB自带的监控工具,如
- 查询性能监控:
- 利用
slowms
参数设置慢查询阈值,通过db.setProfilingLevel(2, {slowms: 100})
开启慢查询日志,分析慢查询的原因,是否由于索引不合理导致。 - 定期分析查询日志,总结查询性能趋势,及时发现潜在的索引问题。
- 利用
调优策略
- 索引重建:
- 长时间运行后,索引可能出现碎片化,影响性能。可以通过删除并重新创建索引来整理碎片,提高索引效率。但此操作要谨慎,选择合适的时机执行。
- 索引覆盖查询:
- 设计查询时,尽量让索引覆盖查询结果,减少回表操作。例如,查询只需要
name
和age
字段,且这两个字段在同一索引中,就可以直接从索引获取数据,提高查询速度。
- 设计查询时,尽量让索引覆盖查询结果,减少回表操作。例如,查询只需要
- 负载均衡:
- 对于高并发场景,采用分片集群架构,将数据分布到多个节点上,分散索引维护压力。通过合理的分片键选择,确保数据均匀分布,提升系统整体性能。