建了Tiflash副本,什么情况下才会走tiflash呢

【 TiDB 使用环境】
V5.2.3

【概述】 场景 + 问题概述
建立副本之后
EXPLAIN analyze SELECT * FROM tt_ga_p_customer a; 走了tiflash

EXPLAIN analyze SELECT * FROM tt_ga_p_customer a WHERE a.sc_uid = 1001546;
没有走tiflash

为什么会一个走了tiflash一个没走呢,和sc_uid是索引字段有关系嘛

对于创建了 TiFlash 副本的表,TiDB 优化器会自动根据代价估算选择是否使用 TiFlash 副本,这个估算是根据统计信息来的。
参考:https://docs.pingcap.com/zh/tidb/stable/choose-index

我不知道我理解的对不对,tiflash查询的性能是不是比tikv的快呢,那优化器为什么不优先选择tiflash呢:joy:

TiKV快还是TiFlash快要看你做的什么操作,像你那个例子走索引就更快点

1 个赞

ttiflash只能将tikv数据转换成列存,特定的返回多列,聚合等sql会更好

好的,在请问一下


我TIKV面板里面的cpu使用率这么高,这种情况是正常的吗(压测情况下出现的)

好的,谢谢

TiDB 优化器会自动根据代价估算选择是否使用 TiFlash 副本。
1)EXPLAIN analyze SELECT * FROM tt_ga_p_customer a; 走了tiflash。
看你的分析结果是 预估扫描的行位11177,而且是 全表扫 tablefullscan 走tiflash 更快。

2)EXPLAIN analyze SELECT * FROM tt_ga_p_customer a WHERE a.sc_uid = 1001546;
这个走了索引,而且结果只有153行,走tikv更快。

手动hint 指定走tiflash
参考:.

select /*+ read_from_storage(tiflash[table_name]) */ ... from table_name;

刚刚试了下强制走tiflash消耗的时间确实比tikv的长。

请问一下,除了聚合sql,哪些场景下也会走tiflash呢

聚合sql也不一定会走tiflash,只是通常情况下聚合更适合列式存储。tiflash比较适合OLAP相关的sql,TiDB 优化器是根据代价估算选择是否使用 TiFlash 副本的,这个估算也不一定准确。


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

OLAP 类的查询通常具有以下几个特点:

每次查询读取大量的行,但是仅需要少量的列
宽表,即每个表包含着大量的列
查询通过一张或多张小表关联一张大表,并对大表上的列做聚合
TiFlash 列存引擎针对这类查询有较好的优化效果:

(1) I/O 优化

每次查询可以只读取需要的列,减少了 I/O 资源的使用
同列数据类型相同,相较于行存可以获得更高的压缩比
整体的 I/O 减少,令内存的使用更加高效
(2) CPU 优化

列式存储可以很方便地按批处理字段,充分利用 CPU Cache 取得更好的局部性
利用向量化处理指令并行处理部分计算

1 个赞

与标题有些差异,但还是有用的学习

我觉得你走聚合的查询都应该走tiflash

走点查,肯定是TiKV更快啊,行存嘛。
宽表的部分字段范围查肯定TiFlash

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