Database Compression
背景
如果数据库需要从硬盘中获得数据,那么数据的I/O操作才是数据库的瓶颈。所以需要对数据进行压缩。
内存中的数据库管理系统比较复杂。压缩数据库降低了DRAM的性能要求和处理时间。DRAM不仅价格贵,而且在运行且维护的代价也非常大。
关键在于如何平衡速度和压缩率之间的关系。在内存数据库中,按照老师的说法,总是选择速度而不是压缩率。也就是说,如果有一个压缩率非常棒的算法,但是它的速度较慢,也不会选择这个。因为如果内存数据库的运行速度变慢,就失去了它最大的优势。
现实世界中的数据特性
我们可以根据现实世界中一些数据的特点设计特定的压缩算法。
数据集倾向于对属性值分布严重偏斜。比如,zipfian分布(在给定的语料中,对于任意一个term,其频度(freq)的排名(rank)和freq的乘积大致是一个常数。例如,url,少量的页面被大量的页面引用;大量的页面被少量的页面引用)。
数据集往往有相同的元组属性之间的高度相关性。比如,邮政编码与城市、火车的出发时间和到达时间。
压缩目标
目标1:必须产生固定长度的值。这种数据存储的优势在上篇文章说了。
目标2:允许DBMS在查询执行期间尽可能延缓解压缩。在查询的时候,假设DBMS是一条一条查,那么它就应该是一条一条数据解压。这个目标在朴素压缩上是难以完成的,但是后两种压缩方式都有围绕这个目标进行设计。
无损压缩 vs 有损压缩
对于DBMS而言,所有的压缩都应该是无损的。你从什么数据压缩过来,就应该能够完全地解压回这种方式。
如果需要有损压缩,那么一定是在应用层面上的设计,应用设计者人为地造出有损压缩。但是对于DBMS,它并不清楚什么数据可以进行有损压缩,什么数据需要进行无损压缩,所以一律都是无损的。
有一些新式的DBMS支持模糊查询:BlinkDB, SnappyData。
压缩粒度(COMPRESSION GRANULARITY)
- Block-level
- 压缩同一个表的一组元组。
- Tuple-level
- 压缩整个元组的内容(仅NSM)。
- Attribute-level
- 压缩一个元组中的单个属性值。
- 可以为同一个元组定位多个属性。
- Column-level
- 压缩为多个元组存储的一个或多个属性的多个值&#x