0

如果我了解 MySQL 表的工作原理,那么即使大多数列都是空白的,表的每个实例都会消耗其全部内存分配。例如,一个空白的 TEXT 列即使为空也会消耗 65536 个字节。如果稍后仅在此列中输入几个字符,它仍会占用完整的 65536 个字节。

在 Rails 迁移中,您可以为每列设置字符限制。例如,您可以将该 TEXT 列限制为 500 个字符。这样做时,您是否还减少了为该列分配的内存,以便它消耗而不是 65536 字节,但需要多少字节来表示 500 个字符?

如果我确信该列将始终限制为 500 个字符,那么将其限制在数据库内还是仅在模型验证内是一种常见的做法?

4

1 回答 1

4

例如,一个空白的 TEXT 列即使为空也会消耗 65536 个字节。如果稍后仅在此列中输入几个字符,它仍会占用完整的 65536 个字节。

不正确。请参阅数据类型存储要求

字符串类型的存储要求

在下表中,M表示非二进制字符串类型的声明列长度和二进制字符串类型的字节。L表示给定字符串值的实际长度(以字节为单位)。

+-----------------------------+------------------ ------------------------------+
|          数据类型          |                 需要存储                |
+-----------------------------+------------------ ------------------------------+
| 字符(M                      | M × w字节,0 <= M <= 255,其中w是 |
| | 最大长度所需的字节数 |
| | 字符集中的字符 |
+-----------------------------+------------------ ------------------------------+
| 二进制(M                    | M字节,0 <= M <= 255 |
+-----------------------------+------------------ ------------------------------+
| VARCHAR(MVARBINARY(M     | L + 1 个字节,如果列值需要 0 – 255 |
| | 字节,如果值可能需要更多字节,则为L + 2 个字节 |
| | 超过 255 个字节 |
+-----------------------------+------------------ ------------------------------+
| TINYBLOB , TINYTEXT           | L + 1 个字节,其中L < 2 8                         |
+-----------------------------+------------------ ------------------------------+
| BLOB ,文本                  | L + 2 个字节,其中L < 2 16                       |
+-----------------------------+------------------ ------------------------------+
| 中文字_       _ L + 3 个字节,其中L < 2 24                       |
+-----------------------------+------------------ ------------------------------+
| LONGBLOB ,长文本          | L + 4 个字节,其中L < 2 32                       |
+-----------------------------+------------------ ------------------------------+
| ENUM(' value1 ',' value2 ',...) | 1 或 2 个字节,取决于 | 的数量
| | 枚举值(最多 65,535 个值)|
+-----------------------------+------------------ ------------------------------+
| SET(' value1 ',' value2 ',...)   | 1、2、3、4 或 8 个字节,取决于数字 |
| | 集合成员(最多 64 个成员)|
+-----------------------------+------------------ ------------------------------+
于 2013-05-21T15:14:21.897 回答