Tiflash执行计划不生效

image 执行计划还是走的tikv。
image 不带条件查询是生效的。
请问这个tiflash生效了吗?

走 tiflash 是有一定下推算法的,有具体支持的下推计算规则的,可以参考一下官方文档。

https://docs.pingcap.com/zh/tidb/stable/use-tiflash#tiflash-支持的计算下推

TiFlash 支持的计算下推

TiFlash 支持部分算子的下推,支持的算子如下:

  • TableScan:该算子从表中读取数据
  • Selection:该算子对数据进行过滤
  • HashAgg:该算子基于 Hash Aggregation 算法对数据进行聚合运算
  • StreamAgg:该算子基于 Stream Aggregation 算法对数据进行聚合运算。StreamAgg 仅支持不带 GROUP BY 条件的列。
  • TopN:该算子对数据求 TopN 运算
  • Limit:该算子对数据进行 limit 运算
  • Project:该算子对数据进行投影运算
  • HashJoin:该算子基于 Hash Join 算法对数据进行连接运算,但有以下使用条件:
    • 只有在 MPP 模式下才能被下推
    • 必须带有等值的 join 条件
    • 不支持下推 Full Outer Join

在 TiDB 中,算子之间会呈现树型组织结构。一个算子能下推到 TiFlash 的前提条件,是该算子的所有子算子都能下推到 TiFlash。因为大部分算子都包含有表达式计算,当且仅当一个算子所包含的所有表达式均支持下推到 TiFlash 时,该算子才有可能下推给 TiFlash。目前 TiFlash 支持下推的表达式包括:

+, -, /, *, >=, <=, =, !=, <, >, ifnull, isnull, bitor, in, bitand, or, and, like, not, case when, month, substr, timestampdiff, date_format, from_unixtime, json_length, if, bitneg, bitxor,
round without fraction, cast(int as decimal), date_add(datetime, int), date_add(datetime, string), min, max, sum, count, avg, approx_count_distinct

其中, castdate_add 的下推默认不开启,若需要手动开启,请参考优化规则及表达式下推的黑名单

另外,所有包含 Time/Bit/Set/Enum/Geometry 类型的表达式均不能下推到 TiFlash。

如查询遇到不支持的下推计算,则需要依赖 TiDB 完成剩余计算,可能会很大程度影响 TiFlash 加速效果。对于暂不支持的算子/表达式,将会在后续版本中陆续提供支持,也可以联系官方沟通。

如果某个字段有个索引,就不能用到算子下推吗?尝试了不使用索引字段作为查询条件,是可以使用tiflash的。是不是意味着Tiflash表结构不需要索引结构,这对查询速度有影响吗?

可以强制使用TiFlash,这种写法

select /*+ read_from_storage(tiflash[tb]) */
count(*)
from table tb

有TiFlash时会强制使用TiFlash,就算有索引也会使用TiFlash,
没有TiFlash时会和普通查询一样,有索引就使用索引
注意,中括号里的是表别名

优化器会自动选择相对较优的执行计划来处理,像你提到的这个场景,如果是走索引更快,会先走到 TiKV 索引下推计算,就不会走到 tiflash 上面。