写点什么

TiKV & TiFlash 加速复杂业务查询

  • 2022 年 7 月 15 日
  • 本文字数:1801 字

    阅读完需:约 6 分钟

作者: 边城元元原文来源:https://tidb.net/blog/34dcd203

一、TiKV 行存 与 TiFlash 列存混合使用

TiDB 中 query 执行的示意图,可以看到在 TiDB 中一个 query 的执行会被分成两部分,一部分在 TiDB 执行,一部分下推给存储层( TiFlash/TiKV )执行。


1.1 混用原理

| 1 | TiDB 的行列混合并不是传统设计上的行存列存二选一, 而是 TiDB 可以在同一张表同时拥有行存和列存,且两者永远保持数据强一致(而非最终一致)。 || - | —————————————————————————— || 2 | 多表查询分别使用不同的引擎 TIKV 或 TiFlash 。 || 3 | TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。 |

1.2 混用优化

二、标签系统高级筛选

通过标签(从宽表里不确定字段)和窄表特定字段组合查询客户并分页


2.1 Read from TiKV

SELECT /*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */  a.*,  b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT,  c.ORG_ID,c.ORG_NAME,  d.ASSET,d.ASSET_MON_AVG FROM  (  SELECT /*+ READ_FROM_STORAGE(tikv[m],tikv[n]) */    m.cust_id   FROM    m_cust_label m    RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID   WHERE    m.cat1 IN ( 516, 710, 230,3301 )     AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY  n.cust_id ASC   LIMIT 100   ) a  LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id  LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id  LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id ;  
复制代码


4G,2c 虚拟机 300 万数据,首次执行 48 s 二次执行 0.7s

2.2 Read From TiKV & TiFlash


SELECT /*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */ a.*, b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT, c.ORG_ID,c.ORG_NAME, d.ASSET,d.ASSET_MON_AVG FROM ( SELECT /*+ READ_FROM_STORAGE(tiflash[m],tikv[n]) */ m.cust_id FROM m_cust_label m RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID WHERE m.cat1 IN ( 516, 710, 230,3301 ) AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY n.cust_id ASC LIMIT 100 ) a LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id
复制代码


4G,2c 虚拟机 300 万数据,首次执行 3s 二次执行 0.3s

2.3 TiFlash & MPP


set @@session.tidb_allow_mpp=1;set @@session.tidb_enforce_mpp=1;
复制代码


SELECT /*+ READ_FROM_STORAGE(tikv[b], tikv[c],tikv[d]) */  a.*,  b.CUST_NAME,b.CERT_TYPE,b.CERT_NUM,b.CUST_TYPE,b.SEX,b.AGE,b.BIRTH_DT,  c.ORG_ID,c.ORG_NAME,  d.ASSET,d.ASSET_MON_AVG FROM  (  SELECT /*+ READ_FROM_STORAGE(tiflash[m],tiflash[n]) */    m.cust_id   FROM    m_cust_label m    RIGHT JOIN m_cust_org n ON m.CUST_ID = n.CUST_ID   WHERE    m.cat1 IN ( 516, 710, 230,3301 )     AND n.ORG_ID IN ( '133','8716', '7162') ORDER BY  n.cust_id ASC   LIMIT 100   ) a  LEFT JOIN m_cust_main b ON a.cust_id = b.cust_id  LEFT JOIN m_cust_org c ON a.cust_id = c.cust_id  LEFT JOIN m_cust_data d ON a.cust_id = d.cust_id 

复制代码


使用 MPP 模式来执行查询后基本秒开,4G 2c 虚拟机 300 万数据,首次执行 1s 二次执行 0.15s

2.4 SPM 固定执行计划

CREATE GLOBAL|SESSION  BINDING for  <BindableStmt > USING <BindableStmt2>SHOW GLOBAL|SESSION BINDINGS ; -- 查看绑定计划explain format = 'verbose' <BindableStmt2>;show warnings; -- 通过执行 show warnings 了解该 SQL 语句使用了哪一条 binding
复制代码


固定特定查询走 TiFlash 列存查询。


三、标签下价值机构排名

3.1 根据选中的属性(多值)

使用这些值最多的排名前 3 的机构,并统计出总额


3.2 执行计划

table:c 走 TiFlash ;table:a, table:b 走 TiKV ,同时使用了列存和行存的优势。




四、总结

使用 TiKV 和 TiFlash 可以加速复杂查询,下面简单增加了使用使用场景。



如果有描述不当的地方欢迎评论指正!


谢谢 PingCAP 社区的大力支持!


发布于: 刚刚阅读数: 2
用户头像

TiDB 社区官网:https://tidb.net/ 2021.12.15 加入

TiDB 社区干货传送门是由 TiDB 社区中布道师组委会自发组织的 TiDB 社区优质内容对外宣布的栏目,旨在加深 TiDBer 之间的交流和学习。一起构建有爱、互助、共创共建的 TiDB 社区 https://tidb.net/

评论

发布
暂无评论
TiKV & TiFlash 加速复杂业务查询_实践案例_TiDB 社区干货传送门_InfoQ写作社区