TiDB开启列式存储后,磁盘层面具体是怎么存储的?和行存的物理存储差异在哪?
1 个赞
- TiKV 节点 : Key-Value, 负责行式存储(Row Store),处理 OLTP。
- TiFlash 节点 : DeltaTree, 负责列式存储(Column Store),处理 OLAP。
按列存储 :数据按列 独立存储。例如,user 表的 name 列所有数据存储在一个文件中,age 列存储在另一个文件中
可以参考这两篇文章看看
列存是把一列数据保存在一起,而且是排序的,相同数据多压缩比也高减少了磁盘io数据量,扫描单个字段会很快
| 维度 | 行存储(TiKV) | 列存储(TiFlash) |
|---|---|---|
| 存储单元 | 按行打包,一行的所有列连续存储 | 按列拆分,同一列的所有行连续存储 |
| 数据读取 | 读取整行(即使只需要部分列),点查高效 | 仅读取所需列,聚合 / 分析查询高效 |
| 压缩效率 | 低(列类型混杂,重复度低) | 高(同列数据类型统一,专属压缩算法) |
| 物理文件组织 | SST 文件按行 Key 有序排列 | 按列分块存储,列块 + 元数据文件分离 |
| 索引方式 | 基于行 Key 的全局有序索引 | 列块级轻量级索引(Min/Max、位图等) |
| 适用场景 | OLTP(增删改查、事务、低延迟点查) | OLAP(聚合统计、批量分析、复杂查询) |
个人理解行存是传统的存储模式,适合OLTP,方便用户点查的场景,比如:用客户号查询某个客户的个人信息,该客户的相关字段可以一次性获取到。列存则通常用于OLAP场景,如:报表系统跑批量计算任务。
- 核心差异:行存(TiKV)按行打包存储,一列查询需加载整行;列存(TiFlash)按列拆分存储,仅加载目标列,且压缩比更高;
- 磁盘结构:TiKV 是 LSM 树的 Key-Value 块,TiFlash 是列级数据块 + 轻量索引;
- 落地特征:TiFlash 列存需创建副本,与 TiKV 强一致,自动适配 OLAP 查询,磁盘占用更低但写入效率略低。
列式存储数据放到tiflash里面,使用分析类的业务
TiKV(行存):像书,一行行写,整行一起存。
TiFlash(列存):像Excel 拆成单列,每一列单独存。
列存是以列为组织存储的,可能更好的进行编码压缩