面试题答案
一键面试专享索引可能面临的性能问题
- 写操作性能下降:高并发写操作时,每个写操作都需要更新索引,这会增加磁盘I/O和CPU负载。例如,插入大量文档时,索引更新可能成为瓶颈,导致写操作延迟增加。
- 锁争用:MongoDB的索引操作会使用锁,高并发场景下,多个读写操作可能竞争锁资源。例如,一个写操作持有锁更新索引时,其他读写操作需要等待,降低系统并发度。
- 内存压力:专享索引会占用额外内存,在高并发读写且索引数据量较大时,可能导致内存不足,使MongoDB频繁进行磁盘数据交换,严重影响性能。
通过索引设计和配置缓解问题的方法
- 合理设计复合索引
- 分析查询模式:根据应用的常见查询条件,设计包含多个字段的复合索引。例如,如果经常按照“时间戳”和“用户ID”查询文档,可创建复合索引{时间戳: 1, 用户ID: 1}。这样可以减少索引数量,降低写操作时索引更新开销。
- 选择合适的索引顺序:复合索引中字段顺序很重要,应将选择性高(区分度大)的字段放在前面。如上述例子中,如果时间戳区分度更大,就应放在前面。
- 部分索引
- 创建部分索引:对于只在特定条件下使用的索引,可以创建部分索引。例如,只对状态为“active”的文档创建索引,语法如下:
db.collection.createIndex(
{ field1: 1, field2: 1 },
{ partialFilterExpression: { status: "active" } }
);
- **优点**:减少索引数据量,降低内存占用和写操作开销,提高高并发场景下性能。
3. 索引配置优化
- 调整索引缓存:根据服务器内存情况,合理调整MongoDB的索引缓存大小。可以通过修改配置文件中的--wiredTiger.engineConfig.cacheSizeGB
参数,适当增加缓存大小,提高索引访问性能。
- 定期重建和优化索引:定期对索引进行重建(reIndex
)和优化(compact
)操作,以清理索引碎片,提高索引效率。例如,在业务低峰期执行db.collection.reIndex()
命令重建索引。