问题是,下面的代码需要很长时间才能执行,我在集合中有50K文档,执行需要15秒。该函数采用epochTime并获取比filteredDate更早的文档。然后查找并删除它们。
public Mono<List<AuditLog>> archiveAuditLogs(long filteredEpochTime) {
Query query = new Query();
Date filteredDate = Date.from(Instant.ofEpochMilli(filteredEpochTime));
query.addCriteria(Criteria.where("createdAt").lte(filteredDate));
return this.mongoTemplate.findAllAndRemove(query, AuditLog.class).collectList();
}
字符串
如何优化这段代码?
1条答案
按热度按时间zysjyyx41#
可能有很多原因导致这样糟糕的性能,50 K记录的集合大小(尽管我不知道集合的物理大小)一点也不大。
尽管如此,发出的请求是很简单的.我可以建议的事情:
1.我假设你需要
AuditLog
的已删除示例,因为你要返回它们。但是如果你只是需要删除记录的数量或一些关于删除的Meta信息,那么只发出这个查询而不是findAllAndRemove()
就足够了。问题是findAllAndRemove()
实际上触发了2个查询-一个是读取所有要删除的数据,另一个是删除读取记录。这肯定会影响您的性能,但同样,如果这是一个需求,I do not see a clear way out to return records after deletion in MongoDB,请记住它。1.启用queries profiling一段时间。然后你可以检查一下每个查询到底花了多少时间。也许COLLSCAN影响了你的性能,你需要添加some indexes。也许这是由于主/从网络问题,我在我的生活中遇到过几次。所以基本上这些方法与你的代码库无关。
希望我能提供一些指导,祝你有一个美好的一天!