在最大限度地减少冗余方面,像MySQL和H2这样的数据库有多聪明?

时间:2011-08-23 23:51:52

标签: mysql sql database h2 scalaquery

我是数据库新手,这个问题与我对数据库的期望有多大关系。这里的“数据库”我的意思是“类似”MySQL或H2(我实际上不知道这两个是否相似,只是它们很受欢迎)。我实际上正在使用ScalaQuery,因此它从底层数据库中抽象出来。

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

(亚当,18岁) (亚当,24岁) (亚当,34岁) ... 继续 ... (亚当,3492) (Bethany,4) (Bethany,45岁) ... 继续 ... (Bethany,2842)

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

相关:如果H2在这方面很聪明,那么双打是否同样聪明?在我可能是脑死亡的初始表中,我碰巧有很多重复的双重字段。

谢谢!

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:2)

数据库旨在存储信息。数据库无法知道(Adam,44)和(Adam,55)是否可以被压缩,如果数据库试图像您提议的那样做,我会被吓呆,因为这会导致各种性能和/或逻辑问题。

相反,数据库不会最小化存储,它们会添加冗余信息,如索引和密钥,以及DB所需的其他内部附加信息。

构建数据库是为了快速检索信息,而不是有效地存储空间。当涉及复杂性时,数据库会增加存储空间,然后降低查询的性能。

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

基于连续存储的MySQL和其他SQL产品在这种情况下并不聪明。

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

答案 4 :(得分:0)

您要么在谈论数据压缩,这可以由数据库引擎完成,而不应该是您关注的问题。 或者你在谈论数据规范化。那么你应该阅读数据库设计。

数据库用于存储数据,因此无需担心一些冗余。如果您要进入数百万行和千兆字节的数据,那么您可以开始考虑选项。但是达到这个水平,你就不会有任何性能问题。