列裁剪和行存储

在TiDB源码和文档中,一个表的Insert语言最终是以行存储的形式插入到kv数据库中,但是在https://pingcap.com/blog-cn/tidb-source-code-reading-7/ 这个文档中,关于列裁剪部分介绍的是

列裁剪的思想是这样的:对于用不上的列,没有必要读取它们的数据,无谓的浪费 IO 资源。比如说表 t 里面有 a b c d 四列。

select a from t where b > 5

这个查询里面明显只有 a b 两列被用到了,所以 c d 的数据是不需要读取的。在查询计划里面,Selection 算子用到 b 列,下面接一个 DataSource 用到了 a b 两列,剩下 c 和 d 都可以裁剪掉,DataSource 读数据时不需要将它们读进来。

这就有点疑惑了,行存储的形式在读取的时候只能把一行数据都读取出来,那怎么能够过滤列呢?

TiKV 先读取整行数据,解码出 a b 两列。这样就只把 a b 两列的数据发给 TiDB。