在Spring,我加载了一个集合(一百万条记录)的分页表,这需要很长时间。在日志中,我可以看到count的查询花费了超过10秒的时间:
gameRepository.findAll(PageRequest.of(0, 10, Sort.by("played").descending())
日志:
执行计数:{}在集合中:游戏<-需要10秒!!
当我通过mongo shell执行count命令时,它会立即出现:
db.game.count(); // -> 1332751
为什么spring数据需要这么长时间?
2条答案
按热度按时间1szpjjfi1#
有两种方法可以计算数据库中的数据:
执行计算精确集合的查询,然后查看找到了多少个结果。
在元数据中记录集合/表的大小。
第二种方法提供了一个近似计数-它通常接近实际计数,但通常并不完全正确。因为检索此计数不需要查询存储的文档,所以速度非常快。
shell助手使用近似计数。我假设分页查询使用的是准确的计数。
m2xkgtsf2#
有
long count();
中的方法JpaRepository
(计算实体集合总数)和long count(Specification<T> spec)
中的方法JpaSpecificationExecutor
(计算一些过滤的子集)。您应该使用它们,而不是将集合加载到内存中
效率比
因为它们被翻译成
SELECT COUNT(...)
本机sql查询。