[转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践
复杂业务查询对于传统的关系型数据库来说是一种考验,而通过 TiKV 行存与 TiFlash 的列存结合使用就能很好地应对。本文根据 TUG 用户边城元元在 TiDB 社区技术交流石家庄站的分享整理,详细介绍了 TiKV & TiFlash 加速复杂业务查询的原理及实践方案。
背景
在互联网公司或传统公司的 CRM 系统中,最常用的功能之一是客户的筛选。通过不同角度、维度、标签的组合来框选客户,以便后续的业务操作。
这无疑是对传统关系型数据库,或者关系数据库加列存数据库的架构是一种考验,主要有下面几个痛点:
传统的关系型数据库无法通过加索引来优化加速查询,业务无法正常开展;
列存数据库需要把筛选相关数据放到列数据库,并且需要做好数据实时同步;
无法从数据库层面做好数据的读取,往往需要从列数据库读取数据后再到关系数据库进行数据合并后输出,性能不容乐观。
TiDB 数据库的 TiKV 和 TiFlash 的组合理论上解决了上面的几个痛点。
TiKV 行存与 TiFlash 列存混合使用
以下为 TiDB 中 query 执行的示意图,可以看到在 TiDB 中一个 query 的执行会被分成两部分,一部分在 TiDB 执行,一部分下推给存储层( TiFlash/TiKV )执行。

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

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

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 万数据,首次执行 48s,二次执行 0.7s。
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。
TiFlash & MPP
控制是否选择 MPP 模式
变量 tidb_allow_mpp 控制 TiDB 能否选择 MPP 模式执行查询。变量 tidb_enforce_mpp 控制是否忽略优化器代价估算,强制使用 TiFlash 的 MPP 模式执行查询。
这两个变量所有取值对应的结果如下:
| tidb_allow_mpp=off | tidb_allow_mpp=on(默认) | |
|---|---|---|
| tidb_enforce_mpp=off(默认) | 不使用 MPP 模式。 | 优化器根据代价估算选择。(默认) |
| tidb_enforce_mpp=on | 不使用 MPP 模式。 | TiDB 无视代价估算,选择 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。
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 的机构,并统计出总额:

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



总结
使用 TiKV 和 TiFlash 可以加速复杂查询,适用场景总结如下:
| 组件 | 适用场景说明 |
|---|---|
| TiKV | 检索条件固定,且有索引 |
| TiFlash | 检索条件不固定,无法加索引 |
| TiKV + TiFlash | 部分表检索条件不固定,部分表有索引 |
[转帖]TiKV & TiFlash 加速复杂业务查询丨TiFlash 应用实践的更多相关文章
- [Skill]从零掌握80%的业务查询SQL语句
前言 本篇文章的主要目的是帮助初学者快速入门SQL查询,从而解决实际业务中80%的SQL查询问题. 本文主要框架如下: 上篇:介绍SQL的语法顺序和执行顺序 中篇:介绍条件子句.分组查询和排序的细节 ...
- Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据
Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段 ...
- Atitit.列表页and查询条件的最佳实践(1)------设定搜索条件and提交查询and返回json数据
Atitit.列表页and查询条件的最佳实践(1)------设置查询条件and提交查询and返回json数据 1. 1. 配置条件字段@Conditional 1 1 2. 2. 配置条件字段显示类 ...
- 一场完美的“秒杀”:API加速的业务逻辑
清晨,我被一个客户电话惊醒,客户异常焦急,寻问CDN能不能帮助他们解决“秒杀”的问题,他们昨天刚刚进行了“整点秒杀活动”,结果并发量过大,导致服务宕机,用户投诉. 为了理清思路,我问了对方三个问题: ...
- MySql分区后创建索引加速单表查询和连表查询
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/konkon2012/article/de ...
- 南海区行政审批管理系统接口规范v0.3(规划)4.2.【queryExpireList】当天到期业务查询
加密前:{"time":"1510053168455","username":"GH_DATA_EXCHANGE",&q ...
- TiKV 在京东云对象存储元数据管理的实践
京东云对象存储是在 2016 年作为公有云对外公开的,主要特点是可靠.安全.海量.低成本,应用于包括一些常用的业务场景,比如京东内部的京东商城视频/图片云存储,面向京东云公有云外部的开发者的服务,和面 ...
- CDN HTTPS安全加速基本概念、解决方案及优化实践
大家都知道,HTTP 本身是明文传输的,没有经过任何安全处理,网站HTTPS解决方案通过在HTTP协议之上引入证书服务,完美解决网站的安全问题.本文将为大家介绍阿里云CDN HTTPS安全加速传输的基 ...
- DDD实战进阶第一波(八):开发一般业务的大健康行业直销系统(业务逻辑条件判断最佳实践)
这篇文章其实是大健康行业直销系统的番外篇,主要给大家讲讲如何在领域逻辑中,有效的处理业务逻辑条件判断的最佳实践问题. 大家都知道,聚合根.实体和值对象这些领域对象都自身处理自己的业务逻辑.在业务处理过 ...
- iOS业务模块化利用CocoaPod入门实践
iOS业务模块化即是通过不同的工程管理不同的业务,通常应用在中大型项目中,这样做的好处主要有:1.多人开发时,防止工程文件冲突 2.能够为下个不同的项目抽取代码,话不多说,直接看步骤:括号内容为本例 ...
随机推荐
- Docker、pre-commit 导致的 git commit 报错:找不到 python 3.8
到这个问题的原因可能有很多,这里只是记录下针对我遇到这这跟题的原因及解决方法 问题描述 执行 git commit 命令,报错 /usr/bin/env: 'python3.8': No such f ...
- 文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题
文心一言 VS 讯飞星火 VS chatgpt (56)-- 算法导论6.3 2题 对于 BUILD-MAX-HEAP 中第 2行的循环控制变量 i 来说,为什么我们要求它是从A.length/2到1 ...
- linux中redis下载安装部署启动
下载安装部署 创建一个存放Redis的文件夹,下载安装包 mkdir redis 进入redis文件 cd redis 下载redis安装包 wget http://download.redis.io ...
- ModelBox姿态匹配:抖抖手动动脚勤做深呼吸
摘要:本案例使用Windows版本的ModelBox SDK进行二次开发,主要是针对姿态匹配案例开发实践. 本文分享自华为云社区<姿态匹配:抖抖手动动脚勤做深呼吸>,作者:吴小鱼. 在之前 ...
- centos8 nginx server root指向自定义目录如(/data/www),访问报403 404,所有文件用户组为root 权限为755
centos8 yum 自定义安装的nginx,修改nginx默认默认目录,指向自定义的目录 /data/www,访问报404,所有文件用户组为root 权限为755 nginx 以user 为ngi ...
- iOS打包IPA教程
转载:xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果 IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需 ...
- MySQL 添加用户,分配权限
1. 添加用户 CREATE USER `vipsoft`@`%` IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER; 2. 权限配置 GRANT 权限1,权限 ...
- VWAP 订单的最佳执行方法:随机控制法
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 引言:相关研究 在当今的投资领域,算法交易正迅速成为客户获取和清算股票头寸的首选方法. 通常,被委托者会 ...
- Axure RP 9 下载、破解激活教程、最新激活码,亲测可用
本教程适用于 Axure RP 9 Enterprise/Pro/Team 的激活.破解,最新激活码,适用于 windows, mac系统,仅用于学习 简介 Axure RP 9.0 破解版是一款功能 ...
- VF01/VF11 创建和冲销开票凭证
1.创建开票凭证 1.1.前台 VF01创建开票凭证 1.2.源代码 "--------------------@斌将军--------------------DATA:lt_billing ...