我有一个大约有 1 亿行的表。其中一列是VARCHAR(64)
用于utf8mb4
存储用户昵称的编码(其他列是几个整数)。
该列中的数据有MAX(LENGTH()) == 42
和MAX(CHAR_LENGTH()) == 24
(如果需要,我可以附上长度分布的图像)。约 90% 的行仅使用 ASCII 字符。
从 MySQL 文档来看,
CHAR(30) 最多可以容纳 30 个字符。[...] CHAR(255) 列可以超过 768 字节
那么是不是意味着它可以存储N个字符,甚至是多字节呢?那么varchar呢,指定的大小是指字节还是字符?
我的表主要是写入密集型 ( INSERT O.D.K. UPDATE
)。切换到恒定长度字段(尤其是对于这种不是很长的字符串)而不是将它们作为可变长度字段(可能存储在磁盘上的其他位置)是一个好主意吗?
字节长度分布:
Char_length分布:
是的,长度以字符为单位,而不是字节。另请参阅BINARY/VARBINARY 数据类型的文档
不会。恒定长度字段将始终占用最大可能的空间,而 varchar 通常占用的空间要少得多。更少的空间意味着每个磁盘页有更多的行,因此页读/写更少,所需的内存也更少。
另请参阅此问题以了解 CHAR/VARCHAR 比较