TiDB 高级系统管理笔记:sql优化

答:
TiKV读取数据并计算的模块 , 我们定义为Coprocessor , 该概念灵感来自于HBase
TiDB 高级系统管理笔记:sql优化
文章图片
TiKV源码解析系列文章(十四)Coprocessor概览
如图 , 以上查询语句在TiDB中处理如下:
TiDB收到查询语句 , 对语句进行分析 , 计算出物理执行计划 , 组织称TiKV的Coprocessor请求 。 TiDB将该Coprocessor请求根据数据的分布 , 分发到所有相关的TiKV上 。 TiKV在收到该Coprocessor请求后 , 根据请求算子对数据进行过滤聚合 , 然后返回给TiDB 。 TiDB在收到所有数据的返回结果后 , 进行二次聚合 , 并将最终结果计算出来 , 返回给客户端 。 TiDB 高级系统管理笔记:sql优化
文章图片
TiKVCoprocessor处理的读请求目前主要分类三种:
DAG:执行物理算子 , 为SQL计算出中间结果 , 从而减少TiDB的计算和网络开销 。 这个是绝大多数场景下Coprocessor执行的任务 。 Analyze:分析表数据 , 统计、采样表数据信息 , 持久化后被TiDB的优化器采用 。 CheckSum:对表数据进行校验 , 用于导入数据后一致性校验 。TiKV执行器是基于VolcanoModel(火山模型) , 一种经典的基于行的流式迭代模型 。 现在主流的关系型数据库都采用了这种模型 , 例如Oracle , MySQL等 。
我们可以把每个算子看成一个迭代器 。 每次调用它的next()方法 , 我们就可以获得一行 , 然后向上返回
答:
一条读请求 , 使用TableScan算子 , 需要扫出所有行的需求列 , 性能不高 。 3.0之前使用的是火山模型去让请求只需要扫几行 。
SELECT*FROMtableWHEREage>10limit1
每次都从下层算子取一行 , 至多取LIMIT行 , 返回给上层
不断从下层算子取一行 , 按照age>10为过滤条件 , 知道有一条满足条件了返回给上层
扫下一行的age列返回给上层
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片

useindex
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片

统计信息不准确
TiDB 高级系统管理笔记:sql优化TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片

hint
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片

小白:
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片
TiDB 高级系统管理笔记:sql优化
文章图片

#%E8%A1%A8%E7%9A%84%E5%81%A5%E5%BA%B7%E5%BA%A6%E4%BF%A1%E6%81%AF