TiFlash的MPP应该怎么理解?(或者说如何更好使用TiFlash)

MPP(Massively Parallel Processing)的直接翻译是“大规模并行处理”,但是TiDB官方文档里介绍有两块:

  1. 在讲如何开启MPP时,提了一句“TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)”。 使用 MPP 模式
  2. 5.0.0 Release Note中,介绍的也比较模糊。MPP架构

    TiDB 通过 TiFlash 节点引入了 MPP 架构。这使得大型表连接类查询可以由不同 TiFlash 节点分担共同完成。
    当 MPP 模式开启后,TiDB 会通过代价决策是否应该交由 MPP 框架进行计算。MPP 模式下,表连接将通过对 JOIN Key 进行数据计算时重分布(Exchange 操作)的方式把计算压力分摊到各个 TiFlash 执行节点,从而达到加速计算的目的。更进一步,加上之前 TiFlash 已经支持的聚合计算,MPP 模式下 TiDB 可以将一个查询的计算都下推到 TiFlash MPP 集群,从而借助分布式环境加速整个执行过程,大幅度提升分析查询速度。

这两块一个是说怎么开启MPP,一个是说MPP是什么东西。但是并没有介绍MPP针对的是什么应用场景,如何更好的使用MPP?如果只有一个TiFlash节点,对查询优化有帮助么?

是不是,MPP可以更好使用TiFlash列式存储的优势,针对一些查询纬度复杂(比如说订单表,可能查询的纬度有5、6种),如果每个字段都加索引的话,对TiDB的写入性能影响很大,而因为TiFlash是列式存储,天然针对每个字段都做了单列索引,所以对这类复杂查询比较友好?更进一步,是不是只要把表同步TiFlash,那么这个表上的单列索引就可以废弃掉了?
另外,就是多个TiFlash节点和单个TiFlash的优势在什么地方?是如果存在多个TiFlash节点,单个表的Region就可能存在在多个TiFlash节点上,效率更高么?

tiflash 只有粗粒度索引,去掉 tikv 的索引就没办法点查了。如果只有一个 tiflash 节点,对于硬扫全表的聚合查询等查询依然有帮助,只不过帮助有上限。

另外,TiFlash 是列存没错,但是它没有细粒度索引,只有粗粒度。所以没办法以最小代价检索到具体那一列或者一行的数据,都需要扫描很多行。去除表上的单列索引的话,如果你没有点查,或者小范围 filter 查询,是可以去掉 tikv 的索引,但是之后这列的查询基本上就是在 tiflash 大规模扫了,这个并发不能太高。所以无法做 tp 类型的高并发查询了

4 个赞

没回答的问题是,MPP 其实是把需要 join 作计算的任务由以前的单台 tidb,分散在了多台 tiflash 上面。所以如果 join 的中间结果比较大,用 mpp 就对了。

1 个赞

即使是只有一个 TiFlash 节点,对 AP 分析性能通常也是有帮助的。原因是 TiFlash 的存储引擎和计算引擎是针对 AP 计算优化的,效率相对于 TiKV 和 TiDB 更高。
TiFlash 的副本数和查询性能没有相关性,副本数只和高可用相关。即使是单副本,TiDB 内部也会尽可能把表的数据分布在多个 TiFlash 节点上,从而同时利用多个节点的并发能力。所以增加 TiFlash 节点总是可以提高查询性能。

3 个赞

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。