count()在collection上花费的时间对于Spring Data非常长,但是对于MongoShell不是.&l



在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查询。

最新更新