【 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是索引字段有关系嘛
【 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呢
TiKV快还是TiFlash快要看你做的什么操作,像你那个例子走索引就更快点
ttiflash只能将tikv数据转换成列存,特定的返回多列,聚合等sql会更好
好的,谢谢
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 副本的,这个估算也不一定准确。
OLAP 类的查询通常具有以下几个特点:
每次查询读取大量的行,但是仅需要少量的列
宽表,即每个表包含着大量的列
查询通过一张或多张小表关联一张大表,并对大表上的列做聚合
TiFlash 列存引擎针对这类查询有较好的优化效果:
(1) I/O 优化
每次查询可以只读取需要的列,减少了 I/O 资源的使用
同列数据类型相同,相较于行存可以获得更高的压缩比
整体的 I/O 减少,令内存的使用更加高效
(2) CPU 优化
列式存储可以很方便地按批处理字段,充分利用 CPU Cache 取得更好的局部性
利用向量化处理指令并行处理部分计算
与标题有些差异,但还是有用的学习
我觉得你走聚合的查询都应该走tiflash
走点查,肯定是TiKV更快啊,行存嘛。
宽表的部分字段范围查肯定TiFlash
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。