MySQL是否自动最小化重复的VARCHAR存储?

问题是针对运行在Ubuntu 10.04 LTS服务器上的
MySQL 5.5,默认的InnoDB表类型…

假设我有一个表“地址”的房屋地址,其中包含“数字”,“街道”,“地区”,“城镇”,“县”和“邮政编码”栏.我将在这些列中有许多具有相同值的行,并且我将单独索引它们以进行搜索.假设我将每列实现为VARCHAR(127)并使用town =’London’创建1000行.这是否意味着我在我的数据库中最终得到1000个字符串’London’,或者MySQL做了一些聪明的事情并且只存储了一次字符串,然后从所有1000行引用该单个副本?

我一直在做的事情是通过为每个列创建单独的表来显式处理重复项,每个列都有“id”和“value”列,然后在Address表中使用外键来引用每个列中的唯一值表.每次我插入一个新的地址行时,我搜索每个表以查看数字,街道,区等是否已经存在.如果是,我使用现有索引,如果没有,那么我在该表中插入一行并使用新索引.

显然,我的方法最小化了存储的VARCHAR字符串的数量,因为每个副本只有一个副本.问题是,如果我只是将列声明为VARCHAR并将它们编入索引,MySQL是否会做同样的事情(或更好!)

最佳答案 您将获得1000份“伦敦”.在VARCHAR(127)中,每个副本的长度为1或2个字节,“伦敦”为6个字节.可以这样想……指向单个副本等的开销可能比节省更多(平均).

如果你在谈论索引中的“前缀去除”,那就没有做,但是已经提出了建议.这实际上是一种节省空间的更通用的方法,但它仅适用于类似索引的结构.

(这个答案适用于所有版本的MySQL,所有常见的引擎,所有CHARACTER SET.)

寻找“列存储”,例如InfiniDB.

此外,TokuDB,带有ROW_FORMAT = COMPRESSED的InnoDB,FusionIO等将使用压缩技术来减少磁盘使用.那些没有你所描述的重复数据删除.

点赞