1.2.3 数据压缩
我们知道数据体积的减小可以非常有效地减少磁盘空间占用,提高I/O性能,这对整体查询性能的提升非常有效。通常情况下,查询消耗在I/O方面的时间远大于消耗在数据解压缩方面的时间。除了使用通用的压缩编解码器,ClickHouse还针对特定类型的数据设计了专用的编解码器,实现了更加优异的性能。官方数据显示,通过使用列存储,在某些分析场景下,加速效果可以提升100倍甚至更高。这背后的重要原理有如下几点。
❑由于采用列存储,同一列数据属于同一类型,压缩效果显著。列存储往往有高达10倍甚至更高的压缩比,可以节省大量存储空间,降低存储成本。
❑更高的压缩率意味着更小的数据量,从磁盘读取相应数据所需的时间更少。
❑数据压缩算法按需定制,可自行选择最优算法。不同列的数据具有不同的数据类型,因此适用的压缩算法也不尽相同。可以针对不同的数据类型选择最合适的压缩算法。
❑高压缩比意味着同样大小的内存可以存储更多的数据,系统缓存效果更好。
一些列式DBMS(例如InfiniDB和MonetDB)中并没有使用数据压缩,而ClickHouse从一开始就支持多种方式的数据压缩,例如LZ4和ZSTD。LZ4在速度上更快,但是压缩率较低,ZSTD正好与之相反。在热数据请求下,LZ4会更快,此时I/O代价小,数据解压缩成为性能瓶颈。
ClickHouse默认使用LZ4压缩方式,以提供更快的执行效率,但是需要占用较多的磁盘容量。(因为通常情况下,我们对响应时间快的诉求优先于节省磁盘存储量。)
小贴士:MonetDB与InfiniDB简介
MonetDB是一个开源的面向列的数据库管理系统。MonetDB的设计初衷是为较大规模数据(如几百万行和数百列的数据库表)提供高性能查询支持,目前已经被成功应用于对数据读取有高性能要求的应用中,如数据挖掘、在线分析处理、文本检索、多媒体检索等。
MonetDB最初由荷兰阿姆斯特丹大学的Peter Boncz和Martin Kersten等人创建,并于2004年9月30日有了第一个开源的发行版(https://github.com/MonetDB/MonetDB)。MonetDB为数据库管理系统的各个系统结构层面带来了创新:
1)MonetDB的存储模型是对数据从垂直方向进行切分。
2)MonetDB是第一个利用CPU缓存对数据查询进行优化的数据库系统。
3)MonetDB会自动管理和协调索引机制,优化查询效率。
InfiniDB提供一个可伸缩的分析型数据库引擎,主要为数据仓库、商业智能以及对实时性要求不严格的应用而开发。它基于MySQL搭建,提供对查询、事务处理以及大数据量加载的支持。代码仓库地址是https://github.com/infinidb/infinidb。