一.TiDB 优化器原理
一般有两种方式:
RBO: 基于规则的优化
CBO:给予成本的优化
数据库一般都是使用的CBO优化方式。
优化器架构图:
- Protocol
协议层,兼容MySQL协议 - Parse
将sql语句转化为AST语法树/ 词法分析 语法分析 - pre process
主要针对pointget 点查,直接下推执行器查询,只返回一行或者操作一行,主键索引,类似于sysbench 压测
还会进行常量折叠,表达式优化,子查询优化 - logical optimize
谓词下推,TiKv过滤,传输到TiDB数据更少。
链接顺序,减少数据量,笛卡尔积 - Physical optimize
扫描方式
索引选择
算子下推
参考地址:https://docs.pingcap.com/zh/tidb/stable/sql-optimization-concepts - TiDB Executor
执行器,真正去执行操作数据
二.执行计划
1.查看执行计划
#查看执行计划,不真正去执行
explain sql;
#查看执行计划,会真正去执行,多一列,analyze
explain analyze
#执行计划格式,不支持MySQL的tree 和json
format=row /dot
#task分类
root表示在TiDBserver执行
cop 表示下推到TiKv或者Tiflash
#执行计划阅读顺序
从上到下,从右到左
#actRows != estRows
原因是统计信息的问题,所以需要先执行analyze 在执行explain analyze 会更加接近实际情况结果.
2.管理执行计划
执行计划管理:
#hint
https://docs.pingcap.com/zh/tidb/stable/optimizer-hints
#SPM
https://docs.pingcap.com/zh/tidb/stable/sql-plan-management
算子分类: 类似于mysql的const 还是uk primary key
三.统计信息管理优化
统计信息原理:统计信息原理
统计信息收集方法:
统计信息导入导出:
四.常用命令
#1.统计信息的meta信息
show stats_meta where db_name=? and table_name=?
#2.查看表的健康状况
show stats_healthy
#3.索引和列的信息
show stats_histograms
4.查看bucket的信息
show stats_bucket
5.其他的操作
https://learn.pingcap.com/learner/course/120005/file/480001;offeringId=9