面试题答案
一键面试创建部分索引优化查询性能
可以基于 category
和 timestamp
字段创建部分索引。例如在 MongoDB 中:
db.collection.createIndex(
{ category: 1, timestamp: 1 },
{ partialFilterExpression: { category: { $exists: true }, timestamp: { $exists: true } } }
);
这样的部分索引仅包含满足 category
和 timestamp
存在条件的文档,在查询特定 category
且 timestamp
在一定范围内的数据时能够显著提升性能,因为索引体积更小,查询时扫描的数据量也更少。
高并发读写场景下性能问题及解决方案
- 性能问题:
- 写操作变慢:索引维护需要额外开销,高并发写操作时,每次插入、更新或删除文档,都可能需要更新索引,导致写操作延迟增加。
- 读操作阻塞:写操作可能会阻塞读操作,特别是在更新索引结构时,可能导致读请求等待,降低读性能。
- 锁争用:高并发场景下,对索引的写操作可能导致锁争用,多个写操作竞争锁资源,进一步降低系统整体性能。
- 解决方案:
- 读写分离:采用读写分离架构,读操作从副本集读取数据,写操作则发送到主节点。这样可以减轻主节点的读压力,提高整体系统的并发性能。
- 优化写操作:批量写入数据而不是单个写入,减少索引更新次数。例如在 MongoDB 中可以使用
bulkWrite
方法。 - 合理设置锁粒度:如果数据库支持,尽量设置更细粒度的锁,减少锁争用范围。例如,一些数据库支持行级锁,相比表级锁能减少锁争用。
- 异步更新索引:在高并发写场景下,可以考虑异步更新索引。即写操作先完成数据的持久化,之后通过异步任务来更新索引,减少写操作的延迟。但这种方式可能导致数据和索引在短时间内不一致,需要根据业务场景权衡。