高级数据库十二:数据库压缩

Database Compression

背景

如果数据库需要从硬盘中获得数据,那么数据的I/O操作才是数据库的瓶颈。所以需要对数据进行压缩。

内存中的数据库管理系统比较复杂。压缩数据库降低了DRAM的性能要求和处理时间。DRAM不仅价格贵,而且在运行且维护的代价也非常大。

关键在于如何平衡速度和压缩率之间的关系。在内存数据库中,按照老师的说法,总是选择速度而不是压缩率。也就是说,如果有一个压缩率非常棒的算法,但是它的速度较慢,也不会选择这个。因为如果内存数据库的运行速度变慢,就失去了它最大的优势。

现实世界中的数据特性

我们可以根据现实世界中一些数据的特点设计特定的压缩算法。

数据集倾向于对属性值分布严重偏斜。比如,zipfian分布(在给定的语料中,对于任意一个term,其频度(freq)的排名(rank)和freq的乘积大致是一个常数。例如,url,少量的页面被大量的页面引用;大量的页面被少量的页面引用)。

数据集往往有相同的元组属性之间的高度相关性。比如,邮政编码与城市、火车的出发时间和到达时间。

压缩目标

目标1:必须产生固定长度的值。这种数据存储的优势在上篇文章说了。

目标2:允许DBMS在查询执行期间尽可能延缓解压缩。在查询的时候,假设DBMS是一条一条查,那么它就应该是一条一条数据解压。这个目标在朴素压缩上是难以完成的,但是后两种压缩方式都有围绕这个目标进行设计。

无损压缩 vs 有损压缩

对于DBMS而言,所有的压缩都应该是无损的。你从什么数据压缩过来,就应该能够完全地解压回这种方式。

如果需要有损压缩,那么一定是在应用层面上的设计,应用设计者人为地造出有损压缩。但是对于DBMS,它并不清楚什么数据可以进行有损压缩,什么数据需要进行无损压缩,所以一律都是无损的。

有一些新式的DBMS支持模糊查询:BlinkDB, SnappyData

压缩粒度(COMPRESSION GRANULARITY)

  1. Block-level
    • 压缩同一个表的一组元组。
  2. Tuple-level
    • 压缩整个元组的内容(仅NSM)。
  3. Attribute-level
    • 压缩一个元组中的单个属性值。
    • 可以为同一个元组定位多个属性。
  4. Column-level
    • 压缩为多个元组存储的一个或多个属性的多个值&#x
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值