如果我有一个很大的字符串,例如"John"
,它在同一张表中存储了很多次:
| Id | Name
|----|------------
| 1 | John
| 2 | John
| 3 | John
| 4 | Bob
| 5 | John
MySQL是否曾经看到"John"
被多次存储在具有数百万行的表中,或者"John"
是否会冗余地存在于磁盘上数百万次?
答案 0 :(得分:5)
是的,MySQL冗余存储字符串。
在表行中,MySQL为每行数据存储一次字符串。
但是在索引中,MySQL仅将值存储一次,并列出了找到该值的行的主键引用列表。因此在索引中,它确实会减少值并唯一地存储它们。
假设MySQL试图检测重复值,并将其存储一次。
仍然必须在每行上存储一些标识符,以指示与该行关联的先前使用的值。
可能的唯一字符串的数量仍然很大,因此标识符本身必须非常大才能枚举它们。
假设您有一个VARCHAR(255)。 How many possible strings can there be? n 255 其中 n 是唯一字符的数量。因此,您还需要一个足够长的字符串标识符来表示该数量的可能值。
因此,在一般情况下,这样做毕竟不会节省太多空间。