我正在尝试减少数据库表占用的空间并优化系统的性能。我有兴趣特别优化一些包含大量数据的MyISAM表。
所以我改变了列类型如下:
- 从INT(11)到BIT(1)或TINYINT(3)或SMALLINT(6)或MEDIUMINT(9)
- 从VARCHAR(...)到CHAR(x),x是有用的最小字符数
但结果出人意料 我在更改之前和之后运行了以下查询:
选择 table_name AS“表”, round(((data_length + index_length)/ 1024/1024),2)“size in MB”FROM information_schema.TABLES WHERE table_schema = “my_schema” AND table_name =“my_table”;
结果:
- 在558 Mb之前
- 673,96 Mb之后
空间增加了。为什么?
修改
问题是CHAR转换。在我的情况下,VARCHAR占用较少的空间,因为字段不是固定的维度,因此固定的CHAR字段需要更多的空间
使用VARCHAR,我的表占用了444 Mb。
答案 0 :(得分:0)
INT
更改应该有所帮助。
VARCHAR
更改应该有所伤害。
除非您(1)数据的长度恒定,并且(2)CHAR
合适,否则不要使用CHARACTER SET
。
VARCHAR
实现为1或2个字节的长度,加上每个字符串所需的字节数。
CHAR(N)
总是占用M * N个字节:M个字节/字符取决于字符集:ascii / latin1:1; utf8:3,utf8mb4:4。
极少数情况下CHAR
实际上优于VARCHAR
。以下是一些:
country_code CHAR(2) CHARACTER SET ascii,
md5 CHAR(32) CHARACTER SET ascii, -- packing into BINARY(16) would be tighter
zip_code CHAR(5) CHARACTER SET ascii, -- MEDIUMINT(5) UNSIGNED ZEROFILL would be tighter
uuid CHAR(36) CHARACTER SET ascii, -- Could be packed into BINARY(16)
嗯......这就是我现在能想到的全部。
而且,不,MyISAM 不从“FIXED”而不是“DYNAMIC”中受益,除非在极少数情况下。由于VARCHAR
较小,因此I / O较少; I / O是处理数据的主要成本。
下一篇:忘记MyISAM并升级到InnoDB。