执行计划还是走的tikv。
不带条件查询是生效的。
请问这个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
其中, cast
和 date_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 上面。