MySQL是否在磁盘上多次冗余存储相同的字符串?

时间:2019-03-07 16:54:28

标签: mysql

如果我有一个很大的字符串,例如"John",它在同一张表中存储了很多次:

 | Id | Name
 |----|------------
 | 1  | John
 | 2  | John
 | 3  | John
 | 4  | Bob
 | 5  | John

MySQL是否曾经看到"John"被多次存储在具有数百万行的表中,或者"John"是否会冗余地存在于磁盘上数百万次?

1 个答案:

答案 0 :(得分:5)

是的,MySQL冗余存储字符串。

在表行中,MySQL为每行数据存储一次字符串。

但是在索引中,MySQL仅将值存储一次,并列出了找到该值的行的主键引用列表。因此在索引中,它确实会减少值并唯一地存储它们。

假设MySQL试图检测重复值,并将其存储一次。

仍然必须在每行上存储一些标识符,以指示与该行关联的先前使用的值。

可能的唯一字符串的数量仍然很大,因此标识符本身必须非常大才能枚举它们。

假设您有一个VARCHAR(255)。 How many possible strings can there be? n 255 其中 n 是唯一字符的数量。因此,您还需要一个足够长的字符串标识符来表示该数量的可能值。

因此,在一般情况下,这样做毕竟不会节省太多空间。