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 将适用于所有数据库(需要定期刷新信息)。
有没有什么简单的方法可以使用 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 将适用于所有数据库(需要定期刷新信息)。