本文共 1098 字,大约阅读时间需要 3 分钟。
行式存储和列式存储是数据库组织数据的两种主要方式,本文将从存储方式、查询性能以及数据压缩等方面,深入探讨两者的优缺点。
行式存储以行为基本单位,将一张表的所有数据按行连续存储。这意味着每一行包含多个字段,通常采用行-major order的方式组织数据。例如,以下表格:
id | name | age |
---|---|---|
1 | Alice | 30 |
2 | Bob | 25 |
在行式存储中,其实存在着多个行的数据,每一行都包含多个字段。而列式存储则有所不同,它以字段(列)为基本单位,将表中所有数据按照列连续存储。例如:
id | name | age |
---|---|---|
1 | Alice | 30 |
2 | Bob | 25 |
在列式存储中,所有id数据集中在id列,每个列的数据点都被独立存储,其特点是数据的高度局部性。
列式存储通过将数据按列存储,能够在查询时显著优化性能。这主要体现在以下几个方面:
字段聚集:列式存储可以将所有相同字段的数据集中存放,例如所有的id数据存放在id列,name字段存放在name列。这样,在进行筛选、排序或关联操作时,可以快速定位目标数据。
缓存利用:很多现代数据库系统支持外排序列存储(SortKey),这允许在查询时将需要排序的字段预先存储在索引或缓存中,从而减少IO操作的开销。
数据压缩:借助数据压缩技术,可以在存储层面上进一步降低数据量。通过将字段映射到唯一的数字代码,数据量可以大幅减少。例如,用字典压缩技术,可以将字符串字段替换为唯一的数字代码,使得数据存储需求大幅降低。
假设有一个字段存储大量重复的字符串值,通常情况下,这些字符串需要大量存储空间。通过字典压缩,每个字符串都被映射到唯一的数字代码,这种映射过程类似于Normalization(规范化)过程的一种反向操作。
字符串值 | 字典映射 |
---|---|
Alice | 1 |
Bob | 2 |
Charlie | 3 |
通过这种方式,每个字段的映射都能减少存储需求,同时又保持了数据的可解析性。
列式存储在查询执行时,以下步骤展示了其优化过程:
字段映射:首先,列式存储将字段的值映射到预先建立的字典表中,获取唯一的键值编码(如ID)。这一步骤只需进行一次字符串比较。
列匹配:用编码后的数字值去匹配对应的列表中的位置,生成1(表示匹配成功)。
位操作:对不同列的匹配结果进行位运算,生成符合所有条件的记录下标。
结果组装:通过下标快速定位出满足查询条件的完整数据记录,并组装最终结果集返回。
通过这种列式存储加数据压缩的方式,可以显著提升查询执行性能,尤其在需要频繁查询或关联的场景中表现尤为突出。
转载地址:http://lariz.baihongyu.com/