count()需要很长时间,而对于mongoshell则需要很长时间

8xiog9wr  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(293)

在Spring,我加载了一个集合(一百万条记录)的分页表,这需要很长时间。在日志中,我可以看到count的查询花费了超过10秒的时间:

gameRepository.findAll(PageRequest.of(0, 10, Sort.by("played").descending())

日志:
执行计数:{}在集合中:游戏<-需要10秒!!
当我通过mongo shell执行count命令时,它会立即出现:

db.game.count(); // -> 1332751

为什么spring数据需要这么长时间?

1szpjjfi

1szpjjfi1#

有两种方法可以计算数据库中的数据:
执行计算精确集合的查询,然后查看找到了多少个结果。
在元数据中记录集合/表的大小。
第二种方法提供了一个近似计数-它通常接近实际计数,但通常并不完全正确。因为检索此计数不需要查询存储的文档,所以速度非常快。
shell助手使用近似计数。我假设分页查询使用的是准确的计数。

m2xkgtsf

m2xkgtsf2#

long count(); 中的方法 JpaRepository (计算实体集合总数)和 long count(Specification<T> spec) 中的方法 JpaSpecificationExecutor (计算一些过滤的子集)。
您应该使用它们,而不是将集合加载到内存中

size = gameRepository.count();

效率比

size = gameRepository.findAll(...).size();

因为它们被翻译成 SELECT COUNT(...) 本机sql查询。

相关问题