行存储和列存储是目前数据库存储的两种方式,行存储一般用于RDMS,列存储一般用于NoSQL。
1 结构布局
行存储数据排列
/ | Column 1 | Column 2 | Column 3 | Column 4 | Column 5 |
---|---|---|---|---|---|
Row 1 | Data 1-1 | Data 1-2 | Data 1-3 | Data 1-4 | Data 1-5 |
Row 2 | Data 2-1 | Data 2-2 | Data 2-3 | Data 2-4 | Data 2-5 |
Row 3 | Data 3-1 | Data 3-2 | Data 3-3 | Data 3-4 | Data 3-5 |
列存储数据排列
/ | Row 1 | Row 2 | Row 3 | Row 4 | Row 5 |
---|---|---|---|---|---|
Column 1 | Data 1-1 | Data 2-1 | Data 3-1 | Data 1-4 | Data 1-5 |
Column 2 | Data 1-2 | Data 2-2 | Data 3-2 | Data 2-4 | Data 2-5 |
Column 3 | Data 1-3 | Data 2-3 | Data 3-3 | Data 3-4 | Data 3-5 |
Column 4 | Data 1-4 | Data 2-4 | Data 3-4 | Data 3-4 | Data 3-5 |
Column 5 | Data 1-5 | Data 2-5 | Data 3-5 | Data 3-4 | Data 3-5 |
2 对比
数据写入
行存储的写入是一次完成,可以保证写入过程的成功或者失败,数据的完整性因此可以确定。列存储需要把一行记录拆分成单列保存,写入次数明显比行存储多。行存储在写入上占有很大优势。
数据修改
数据修改也是一次写入过程,仍然是行存占优。
数据读取
数据读取时,行存储通常将一行数据完全读出,如果只需要其中几列数据的情况,就会存在冗余列。列存储的每一列数据类型是相同的,比如一列都是int。行存储一行记录中保存了多种类型的数据,数据解析需要在多种数据类型之间频繁转换,这个操作很消耗CPU,增加了解析的时间。
优缺点
列存储优点:
- select查询时,不需要的列不会被读取,大幅提高查询性能。
- 同一列的数据容易被压缩。
- 缓存命中率高,活跃的数据缓存到内存中。
- 查询时批处理模式,性能高。
列存储缺点:
- 写入效率低。
- 保证数据完整性上不如行存储。
行存储优点:
- 写入一次完成,时间短。
- 能够保证数据完整性。
行存储缺点:
- select查询时,仅查询一列也需要把整个数据行都读取到内存。
- 产生冗余数据。