gpt4 book ai didi

mysql - 将列类型从 INT 更改为 SMALLINT 和 TINYINT 后,MyISAM 表中的空间增加

转载 作者:行者123 更新时间:2023-11-29 21:26:07 24 4
gpt4 key购买 nike

我正在尝试减少数据库表占用的空间并优化系统的性能。我有兴趣专门优化一些具有大量数据的 MyISAM 表。所以我改变了列类型如下:
- 从 INT(11) 到 BIT(1) 或 TINYINT(3) 或 SMALLINT(6) 或 MEDIUMINT(9)
- 从 VARCHAR(...) 到 CHAR(x),其中 x 是有用的最小字符数

但结果却出乎意料。
我在更改之前和之后运行了以下查询:

SELECT table_name AS "Table", 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。

最佳答案

INT 的更改应该会有所帮助。

VARCHAR 的更改应该会造成伤害。

请勿使用 CHAR,除非您 (1) 数据长度恒定,并且 (2) 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。

关于mysql - 将列类型从 INT 更改为 SMALLINT 和 TINYINT 后,MyISAM 表中的空间增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35511126/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com