Spring MongoRepository查询返回实体过慢问题求助
Spring Data MongoDB 实体转换性能异常排查求助
我已经查看过两个相关话题:Spring MongoRepository POJO转换过慢、Spring Data MongoDB性能问题。我遇到了类似问题,但和@DBRef无关,还没尝试通过自定义转换器解决。
刚接手一个没人熟悉的老项目,首要任务是优化性能。经过多项优化后,最后卡在一个问题上:查询约13000个实体耗时60秒。一开始以为是查询本身(查询prodId在指定集合中的所有数据)的问题,在MongoDB Compass中执行该查询耗时不到1秒,后来发现Compass是分页加载(每页最多100条),加载全量数据时速度也会变慢,但Spring Data的耗时还是异常高。
相关代码
实体类代码
@JsonIgnoreProperties(ignoreUnknown = true) public class MyEntity{ @Field(value = "classId") private String classId; @Field(value = "prodId") private String prodId; @Field(value = "attributes") private List<AttributeEntity> attributes; [...] // 全参构造函数、getter、setter等 }
仓库接口代码
public interface MyEntityRepository extends MongoRepository<MyEntity, String> { List<MyEntity> findByProdIdIn(List<String> ids) throws SmartExchangeMongoException; }
Compass中执行的查询语句
{ "prodId" : { "$in" : ["PROD_ID_1", "PROD_ID_ABCDE", "PROD_ID_0242525", ...] } }
已做的测试和尝试
- prodId字段已建立索引
- 原本使用spring-data-mongodb 3.3.0,升级到4.4.0后耗时无变化
- 自定义查询:
结果耗时和原方法完全相同@Query( "{'prodId' : { '$in' : ?0}}") List<MyEntity> customFindByProdIdIn(List<String> ids) throws SmartExchangeMongoException; - 在MariaDB中模拟类似场景:500000个MyEntity和1000000个AttributeEntity,执行相同查询(约13000个随机prodId),Spring Data执行查询并映射为Java对象耗时不到2秒,速度是MongoDB场景的30倍左右
求助问题
后续我该如何处理?为何这个查询执行耗时如此之久?求配置、仓库使用等方面的建议。我来自SQL领域,完全无法理解Spring Data将Mongo Document转换为Java实体为何如此困难,在MariaDB、PostgreSQL等数据库中执行类似操作从未有过这么高的耗时。希望先确认我们在基础用例中是否存在操作错误,目前已经陷入困境。
内容的提问来源于stack exchange,提问作者Antoine
相关产品推荐
相关产品推荐

