首页 文章

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

提问于
浏览
4

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

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

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

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

1 回答

  • 2

    您将获得1000份"London" . 在 VARCHAR(127) 中,每个副本将占用1或2个字节的长度,加上6个字节的"London" . 可以这样想......指向单个副本等的开销可能比节省更多(平均) .

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

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

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

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

相关问题