列存引擎中提到基线数据的行存,列存与行列存储怎么理解?行列并存,是存一份行格式数据和列格式数据都存一份吗?
帮顶!
行存就是 一行的所有字段的值作为一个整体,存储在一起。
列存就是 每列的所有值存在一起,不同列的值是分开存放的。
基线数据就是合并后的数据(major sstable),而合并后产生的增量数据在memtable 和 Minor SStable 中。至于为什么这么设计,是因为 数据写内存(memtable) + 日志(clog)写到磁盘,这种方式又快又不丢数据。但是内存memtable满了就得落盘(转储),生成 Minor SSTable (数据固化到磁盘),增量数据(同一个数据变更多次会产生多个版本)越来越多后,需要合并成一个版本的数据(合并),这样可以数据的多个版本,减少读放大,减少磁盘的使用。
因为列存能变快的其中一个原因是 向量化 + CPU的SIMD技术,其中向量化是指 一次性取多个数据(比如8192个),这样相比于每次取一条,取多次的方式 可以节省磁盘I/O 。 然后通过CPU的 SIMD技术(一个计算逻辑,但是每次可以计算多个参数),相较于 SISD技术(一个计算逻辑,每次只能计算一个参数)而言,所需的CPU指令更少 ,所以 更少的I/O 和 更少的cpu 指令会让 列存的聚合等操作速度更快。
但是对于单条记录的查询(不需要批量数据的查询,TP)而言,列存并不友好,因为列存的向量化+SIMD本身是有 时间损耗的,而单条记录的查询如果是行存(不需要向量化和SIMD),查询可能会比列存更快。
列存的基线数据是列存(利于单列聚合计算等场景),而增量数据是行存(利于TP) 。