有什么方法可以计算表格占用的字节数吗?我知道您可以从中获得一些信息,information_schema.tables
但这些信息不够准确。
实际需要的是根据InnoDB表定义的字节数,排序规则也可以被认为是utf-8-general-ci。
例如,一个表test
如下
create table test (
col1 varchar(25),
col2 int,
col3 varchar(3),
col4 char(15),
col5 datetime
);
根据表中列的类型,我需要知道一行中可以累积的总行大小。
为 MS SQL Server找到了某种类似的解决方案,但需要它的 MySQL 版本
经过大量思考和研究,找到了一个真正有助于实现所需的答案。这是一个 perl 脚本,参考链接是
http://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
感谢大家的大力帮助。
步骤1:
20 个英文字符:2 + 1*20
20 个中东/斯拉夫字符:2 + 2*20
20 个亚洲字符:2 + 3*20
20 个表情符号:2 + 4*20(你需要
utf8mb4
)第2步:把这些加起来。
第 3 步:乘以 2 到 3 之间的某个值以允许 InnoDB 开销。我发现这个因素通常有效。(但不适用于小型表,也不一定适用于分区表。)
我认为没有理由采用每列的最大大小。
您可以获得比
SHOW TABLE STATUS
或等效数据更接近的information_schema
数据:第 1 步:
SELECT COUNT(*)
-- 我们用这个代替Rows
第 2 步:获取
Data_length + Index_length + Data_free
第三步:划分。
这是我使用 SQL 并根据 MySQL 文档“数据类型存储要求”查询 INFORMATION_SCHEMA.COLUMNS 表的两分钱。
Note: this is not be entirely accurate, as ENUM and SET column sizes depend on the number of enumeration values, respectively set members. Here I used the "worst-case" values (2 and 8 bytes respectively), this already gives a good hint about the row size. One might parse the INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE to get the number of enum values/set members for such columns and then compute the amount of bytes based on what the documentation says.
您需要根据数据类型(此处为 MySQL 参考)知道每个字段的字节大小,然后将这些值汇总在一起。
我制作了一个粗略的 bash 脚本来计算行大小并警告它是否超过了基于模式的限制:
已经有一些此类问题,例如这个:How to estimate/predict data size and index size of a table in MySQL
该问题与您的表格之间的一个区别是您的表格中存在可变长度的字符串 - 请记住考虑它们可以达到的最大大小。
还要记住,从版本 5 开始,
varchar(25)
最多 25个字符而不是 25个字节,因此如果您可能在字符串中看到非 ASCII 字符,则列大小可能会膨胀到最多 100 个字节,因为某些字符占用 4 个字节表示 - 例如“一堆便便表情符号”(我开玩笑说它确实存在 - 如果你当前的浏览器+字体支持它看起来像:?)是 0xF0 0x9F 0x92 0xA9。在 v5 之前,mySQL 在指定字符串类型长度时计算字节而不是字符。关于自动化的编辑
在自动化过程方面,您应该能够以
INFORMATION_SCHEMA
与您为 MS SQL Server 找到的脚本类似的方式从表中获取所需的所有信息。请参阅https://dev.mysql.com/doc/refman/5.0/en/information-schema.html了解有关该内容的一些文档。