在Spring中,我加载了一个集合(100万条记录)的可分页,这需要很长时间。在日志中,我可以看到查询count的时间超过了10秒:
gameRepository.findAll(PageRequest.of(0, 10, Sort.by("played").descending())
日志:
执行count: {} in collection: game<-耗时10秒!!>
当我通过Mongo Shell执行count命令时,它立即出现:
db.game.count(); // -> 1332751
Spring Data需要这么长时间的原因是什么?
在数据库中有两种计算方法:
- 执行计算精确集合的查询,然后查看找到了多少个结果。
- 记录元数据中集合/表的大小
第二种方法提供了一个近似计数——它通常接近实际计数,但通常不完全正确。因为检索这个计数不需要查询存储的文档,所以非常快。
shell帮助器使用近似计数。我假设您的分页查询使用了准确的计数。
在JpaRepository
中有long count();
方法(对整个实体集进行计数),在JpaSpecificationExecutor
中有long count(Specification<T> spec)
方法(对某些过滤后的子集进行计数)。
您应该使用它们而不是将集合加载到内存
size = gameRepository.count();
比
更有效size = gameRepository.findAll(...).size();
,因为它们被转换为SELECT COUNT(...)
本地SQL查询。