将列类型从INT更改为SMALLINT和TINYINT

时间:2016-02-19 17:21:46

标签: mysql myisam sqldatatypes

我正在尝试减少数据库表占用的空间并优化系统的性能。我有兴趣特别优化一些包含大量数据的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。

1 个答案:

答案 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。