mysql - 在 JPA 中获取表大小是一项昂贵的操作吗?

标签 mysql sql jpa jpa-2.0

我在我的 Web 应用程序中实现了用于表格查看的服务器端分页。这意味着用户有按钮来激活第一页、最后一页、下一页和前一页。每次点击都会产生一个服务器请求,其中只返回要显示的记录。

要实现“最后一页”功能和滚动条,我需要客户端具有表格的大小。我可以使用以下方法在服务器端获取它:

public long getCount(Class entityClass) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Long> query = builder.createQuery(Long.class);
    Root root = query.from(entityClass);
    Expression<Long> count = builder.count(root);
    query.select(count);
    TypedQuery<Long> typedQuery = em.createQuery(query);
    return typedQuery.getSingleResult();
}

此表可能非常活跃,有数百万条记录。运行此函数是否会导致 SQL 服务器中的大量 CPU 周期被利用?

关注的是该应用程序的扩展性如何。

最佳答案

这完全取决于数据库,我知道的所有 JPA 实现都会将计数转换为 select count(*) from Table。我们有一个带有 130GB 数据的单表的 Postgresql,大多数行只有几千字节。执行 select (*) from table 需要几分钟;一位开发人员曾经做过一个简单的未索引的 select 查询,全表扫描大约需要 45 分钟。

在进行分页时,您通常会有一个过滤器,对数据查询和计数查询应用相同的过滤器很重要(使用 CriteriaBuilder 的主要原因之一是共享过滤器的过滤部分询问)。今天我推荐使用 Spring-data,因为它几乎可以毫不费力地进行分页。

如果你有很多数据,你可以像google一样,它说'zip'有1.340.000.000个结果,但只允许你向前跳转10页,如果你运行到最后你会看到他们实际上只加载了 1000 页。换句话说,它们会缓存估计大小,但需要您缩小搜索范围以提供更精确的结果。

关于mysql - 在 JPA 中获取表大小是一项昂贵的操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683176/

相关文章:

mysql - 从昨天的日期中选择行

类似于 mysql 的查询,检查逗号分隔数据中的值

java - 使用roo用mongo创建springsource项目

java - Spring JPA : Using multiple projection on same query interface

mysql - SQL Query Select 基于 Group By 的条件

java - 需要有关 Java、JPA、Thymeleaf 和 Mysql 的帮助

SQL "In"语句匹配任何内容

sql - 在表单内的Access中的三个子表单中显示基于相同ID的记录

sql - 如何解决sql server中的 "Arithmetic overflow error converting varchar to data type numeric"错误?

spring - Spring Data JPA 中的动态查询