table 在 Spring 中的大小

Size of table in Spring

有没有什么简单的方法可以使用 Spring + Hibernate 来估算给定 table 的大小(以字节为单位)?以前使用 JDBC + MySQL 我使用过 this one:

这样的脚本
SELECT CONCAT(table_schema, '.', table_name),
       CONCAT(ROUND(table_rows / 1000000, 2), 'M')                                    rows,
       CONCAT(ROUND(data_length / ( 1024 * 1024 * 1024 ), 2), 'G')                    DATA,
       CONCAT(ROUND(index_length / ( 1024 * 1024 * 1024 ), 2), 'G')                   idx,
       CONCAT(ROUND(( data_length + index_length ) / ( 1024 * 1024 * 1024 ), 2), 'G') total_size,
       ROUND(index_length / data_length, 2)                                           idxfrac
FROM   information_schema.TABLES
ORDER  BY data_length + index_length DESC
LIMIT  10;

这应该可以通过多种方式实现,具体取决于您是只需要一条信息还是您所链接的示例脚本中的所有信息。获取一条信息很容易:

@Query(value = "SELECT ROUND(table_rows / 1000000, 2) FROM information_schema.TABLES WHERE table_name=?1", nativeQuery = true)
Long findTableRows(String tableName);

如果您需要访问链接脚本中的所有这些信息,您可以执行以下操作:

第 1 步。创建一个实体 class 来保存该信息:

@Entity
@Table(name = "table_stats")
public class TableStats {
  @Column
  private String tableName;
  @Column
  private Long rows;
  @Column
  private Double data;
  @Column
  private Double size;
  @Column
  private Double indexFraction;
}

第 2 步:(可选)使用名称 table_stats 创建数据库视图或 table,并使用链接脚本用数据填充它。如果创建了 table(这将提供更好的运行时性能),请创建关联的计划作业以按合理的时间间隔定期刷新 table。如果创建视图,检索到的数据将始终是最新的(尽管性能会很慢)。

第 3 步:为 TableStats 创建存储库。

步骤 4a:如果视图或 table 是在上面的步骤 2 中创建的,请将常规方法 TableInfo findByTableName(String name) 放在存储库中。

步骤 4b:如果视图或 table 未在上面的步骤 2 中创建,请将本机查询方法如前所示放入存储库中。


使用本机查询的唯一挑战是该解决方案仅适用于 MySQL,不适用于任何其他数据库。因此,如果您在开发、集成、测试、暂存和生产之间使用不同的数据库,则此方法仅适用于使用 MySQL 的环境,而在所有其他环境中都会失败。创建视图的另一种方法(前提是底层数据库支持创建视图)或 table 将适用于所有数据库(需要定期刷新信息)。