在最小化冗余方面,像 MySQL 和 H2 这样的数据库有多聪明?

Posted

技术标签:

【中文标题】在最小化冗余方面,像 MySQL 和 H2 这样的数据库有多聪明?【英文标题】:How smart are databases like MySQL and H2 when it comes to minimizing redundancy? 【发布时间】:2011-08-23 23:51:52 【问题描述】:

我是数据库新手,这个问题与我期望数据库有多聪明有关。这里的“数据库”是指“类似于”mysql 或 H2(我实际上不知道这两者是否相似,只是它们很流行)。我实际上使用的是 ScalaQuery,所以它从底层数据库中抽象出来。

假设我有一个表,其中包含类型为 (String, Int) 的条目,在 String 条目中有很多冗余。所以我的桌子可能看起来像:

(亚当,18 岁) (亚当,24 岁) (亚当,34 岁) ... 继续 ... (亚当,3492) (伯大尼,4) (伯大尼,45 岁) ... 继续 ... (伯大尼,2842 年)

如果我用 H2 存储这个表,它是否足够聪明地实现“Adam”和“Bethany”重复很多次,并且可以用指向查找表的枚举替换?还是会浪费大量存储空间?

相关:如果 H2 在这方面对字符串很聪明,那么它在双打方面是否也很聪明?在我可能脑残的初始表中,我碰巧有很多重复的双字段。

谢谢!

【问题讨论】:

【参考方案1】:

数据库引擎不是为识别数据中的冗余并修复它们而构建的。这是设计者/开发者的任务。

【讨论】:

谢谢。数据库引擎通常提供哪些服务?从未研究过数据库,我假设某种缓存和某种交叉索引。这些是有效的假设吗?使用数据库还有什么可以给我买的吗? @emchristiansen 我认为是时候给自己买一本关于数据库的书并实际研究数据库了。你可以写一本书来回答你的问题。【参考方案2】:

数据库旨在存储信息。数据库无法知道 (Adam, 44) 和 (Adam,55) 是否可以压缩,如果数据库尝试执行您建议的操作,我会感到震惊,因为这会导致各种性能和/或逻辑问题。

相反,数据库并没有最小化存储,它们正在添加冗余信息,如索引和键,以及数据库所需的其他内部附加信息。

DB 旨在快速检索信息,而不是有效地存储信息。当涉及到复杂性时,数据库宁愿增加存储空间,然后降低查询的性能。

【讨论】:

【参考方案3】:

有一些存储系统会压缩页面,所以这个问题是有效的。我不能谈论MySQL,但我相信它类似于H2。 H2 在这方面不是很聪明。 H2 确实会压缩数据,但仅适用于以下情况:

LOB compression,如果启用。 以下不影响关闭数据库的存储大小:H2当前使用LZF写入时会压缩撤消日志,因此页面中的重复数据将导致写入性能略有提高(但仅在检查点之后)。不过,这可能会在未来发生变化。

另外,H2 使用类似于 UTF-8 的编码来存储文本,但我不会称之为压缩。

【讨论】:

【参考方案4】:

MySQL 和其他基于连续存储的 SQL 产品根本不擅长这种事情。

考虑两个逻辑集,一个引用另一个(即外键)。一种可能的实现方式是将两个集合共有的值物理存储一次,并且两个表都存储一个指向该值的指针(想想 3GL 编程语言中的引用类型变量,例如 C#)。但是,大多数 SQL 产品将值物理存储在两个表中;如果你想要指针,那么最终用户必须自己实现它们,通常使用自动增量整数“代理”键,遗憾的是它会暴露在逻辑模型中。

【讨论】:

【参考方案5】:

您所说的数据压缩可以由数据库引擎完成,您不必担心。 或者您正在谈论数据规范化。然后你应该阅读数据库设计。

数据库是用来存储数据的,所以不必担心冗余。如果您要处理数百万行和数千兆字节的数据,那么您可以开始考虑选项。但是达到这个水平你不会有任何性能问题。

【讨论】:

以上是关于在最小化冗余方面,像 MySQL 和 H2 这样的数据库有多聪明?的主要内容,如果未能解决你的问题,请参考以下文章

mysql-冗余和重复索引

mysql重复索引冗余索引未使用索引的定义和查找

集群中 h2 和 MySQL 的休眠 id 生成器 AUTO_INCREMENT

播放框架2:内存数据库中的h2 mysql兼容模式:转义字符

数据方面高可用方案简单总结

Redis主从复制