TiDB Server #
一、TiDB Server概述 #
1.1 核心定位 #
TiDB Server 是 TiDB 集群的计算层,负责处理 SQL 请求。
text
TiDB Server 核心职责
├── 协议层
│ ├── MySQL 协议兼容
│ ├── 连接管理
│ └── 权限验证
│
├── SQL处理
│ ├── SQL 解析
│ ├── 查询优化
│ └── 执行计划生成
│
├── 执行层
│ ├── 本地执行
│ ├── 分布式执行
│ └── 结果聚合
│
└── 事务管理
├── 事务开始
├── 事务提交
└── 事务回滚
1.2 无状态设计 #
text
┌─────────────────────────────────────────────────────────────┐
│ TiDB Server 特点 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 无状态: │
│ ├── 不存储用户数据 │
│ ├── 可随意启停 │
│ ├── 水平扩展 │
│ └── 负载均衡 │
│ │
│ 存储的信息: │
│ ├── 会话信息 (内存) │
│ ├── 缓存信息 (可配置) │
│ └── 统计信息 (定期持久化) │
│ │
└─────────────────────────────────────────────────────────────┘
二、SQL处理流程 #
2.1 完整处理流程 #
text
SQL 请求处理流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ Client │
│ │ │
│ │ MySQL Protocol │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 1. 连接管理 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ - 连接建立 │ │ │
│ │ │ - 权限验证 │ │ │
│ │ │ - 会话管理 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 2. SQL 解析 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ SQL String │ │ │
│ │ │ ↓ │ │ │
│ │ │ 词法分析 (Lexer) │ │ │
│ │ │ ↓ │ │ │
│ │ │ 语法分析 (Parser) │ │ │
│ │ │ ↓ │ │ │
│ │ │ AST (抽象语法树) │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 3. 预处理 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ - 名称解析 │ │ │
│ │ │ - 类型检查 │ │ │
│ │ │ - 权限检查 │ │ │
│ │ │ - 语义验证 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 4. 查询优化 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 逻辑优化 │ │ │
│ │ │ ↓ │ │ │
│ │ │ 物理优化 │ │ │
│ │ │ ↓ │ │ │
│ │ │ 执行计划 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 5. 执行器 │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ - 构建执行器 │ │ │
│ │ │ - 执行算子 │ │ │
│ │ │ - 返回结果 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ Client │
│ 返回结果 │
│ │
└─────────────────────────────────────────────────────────────┘
2.2 连接管理 #
sql
-- 查看当前连接
SHOW PROCESSLIST;
-- 详细连接信息
SHOW FULL PROCESSLIST;
-- 系统表查询
SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST;
-- 连接参数
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';
连接池配置
text
应用连接池配置建议
┌─────────────────────────────────────────────────────────────┐
│ │
│ 参数 推荐值 说明 │
│ ──────────────────────────────────────────────────────── │
│ maxPoolSize CPU核心数 * 2 + 1 最大连接数 │
│ minPoolSize CPU核心数 最小连接数 │
│ connectionTimeout 30000 (ms) 连接超时 │
│ idleTimeout 600000 (ms) 空闲超时 │
│ maxLifetime 1800000 (ms) 最大生命周期 │
│ │
└─────────────────────────────────────────────────────────────┘
2.3 SQL解析 #
词法分析
text
词法分析示例
┌─────────────────────────────────────────────────────────────┐
│ │
│ 输入: SELECT name FROM users WHERE id = 1 │
│ │
│ 词法分析结果: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Token │ Type │ Value │ │
│ ├───────────────┼────────────┼────────────────────────┤ │
│ │ SELECT │ keyword │ "SELECT" │ │
│ │ name │ identifier │ "name" │ │
│ │ FROM │ keyword │ "FROM" │ │
│ │ users │ identifier │ "users" │ │
│ │ WHERE │ keyword │ "WHERE" │ │
│ │ id │ identifier │ "id" │ │
│ │ = │ operator │ "=" │ │
│ │ 1 │ number │ 1 │ │
│ └───────────────┴────────────┴────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
语法分析
text
AST 结构示例
┌─────────────────────────────────────────────────────────────┐
│ │
│ SQL: SELECT name FROM users WHERE id = 1 │
│ │
│ AST: │
│ SelectStmt │
│ / | \ │
│ SelectList From Where │
│ │ │ │ │
│ name users BinaryOperation │
│ / \ │
│ id = 1 │
│ │
└─────────────────────────────────────────────────────────────┘
三、查询优化器 #
3.1 优化器架构 #
text
查询优化器架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 逻辑优化 │ │
│ │ │ │
│ │ 输入: 逻辑计划 │ │
│ │ │ │
│ │ 优化规则: │ │
│ │ ├── 常量折叠 │ │
│ │ ├── 谓词下推 │ │
│ │ ├── 投影下推 │ │
│ │ ├── Join 消除 │ │
│ │ ├── 子查询展开 │ │
│ │ └── ... │ │
│ │ │ │
│ │ 输出: 优化后的逻辑计划 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 物理优化 │ │
│ │ │ │
│ │ 输入: 逻辑计划 │ │
│ │ │ │
│ │ 优化选择: │ │
│ │ ├── 扫描方式选择 │ │
│ │ │ ├── 全表扫描 │ │
│ │ │ └── 索引扫描 │ │
│ │ │ │ │
│ │ ├── Join 方式选择 │ │
│ │ │ ├── Hash Join │ │
│ │ │ ├── Merge Join │ │
│ │ │ └── Index Join │ │
│ │ │ │ │
│ │ ├── 聚合方式选择 │ │
│ │ │ ├── Hash Aggregation │ │
│ │ │ └── Stream Aggregation │ │
│ │ │ │ │
│ │ └── 代价估算 │ │
│ │ ├── CPU 代价 │ │
│ │ ├── IO 代价 │ │
│ │ └── 内存代价 │ │
│ │ │ │
│ │ 输出: 物理执行计划 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 逻辑优化规则 #
谓词下推
sql
-- 原始查询
SELECT u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active' AND o.amount > 100;
-- 优化后执行顺序
-- 1. 先过滤 users.status = 'active'
-- 2. 先过滤 orders.amount > 100
-- 3. 再执行 Join
text
谓词下推过程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 优化前: │
│ │
│ ┌─────────────┐ │
│ │ Selection │ WHERE u.status='active' │
│ │ │ AND o.amount>100 │
│ └──────┬──────┘ │
│ │ │
│ ┌──────┴──────┐ │
│ │ Join │ │
│ └──────┬──────┘ │
│ ┌─────┴─────┐ │
│ │ │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │ users │ │ orders │ │
│ └─────────┘ └─────────┘ │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ 优化后: │
│ │
│ ┌─────────────┐ │
│ │ Join │ │
│ └──────┬──────┘ │
│ ┌─────┴─────┐ │
│ │ │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │Selection│ │Selection│ │
│ │status= │ │amount> │ │
│ │'active' │ │ 100 │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ ┌────┴────┐ ┌────┴────┐ │
│ │ users │ │ orders │ │
│ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
投影下推
sql
-- 原始查询
SELECT u.name
FROM users u
WHERE u.status = 'active';
-- 优化后只读取 name 和 status 列
-- 不读取其他列如 email, phone 等
子查询展开
sql
-- 原始子查询
SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE status = 'active');
-- 展开为 Join
SELECT o.*
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.status = 'active';
3.3 物理优化选择 #
扫描方式选择
sql
-- 全表扫描 vs 索引扫描
-- 场景1: 高选择性,使用索引
SELECT * FROM users WHERE id = 1;
-- 场景2: 低选择性,可能全表扫描
SELECT * FROM users WHERE status = 'active'; -- 假设80%是active
-- 查看执行计划
EXPLAIN SELECT * FROM users WHERE id = 1;
EXPLAIN SELECT * FROM users WHERE status = 'active';
Join方式选择
text
Join 方式对比
┌─────────────────────────────────────────────────────────────┐
│ │
│ Hash Join: │
│ ├── 构建小表的 Hash 表 │
│ ├── 探测大表 │
│ ├── 适合: 大表 Join 大表 │
│ └── 内存消耗较大 │
│ │
│ Merge Join: │
│ ├── 两表按 Join Key 排序 │
│ ├── 顺序扫描匹配 │
│ ├── 适合: 已排序数据 │
│ └── 内存消耗小 │
│ │
│ Index Join: │
│ ├── 遍历外表 │
│ ├── 通过索引查找内表 │
│ ├── 适合: 外表小、内表有索引 │
│ └── 随机 IO 较多 │
│ │
└─────────────────────────────────────────────────────────────┘
sql
-- 强制使用特定 Join 方式
SELECT /*+ HASH_JOIN(u, o) */ u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id;
SELECT /*+ MERGE_JOIN(u, o) */ u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id;
SELECT /*+ INL_JOIN(o) */ u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id;
3.4 统计信息 #
sql
-- 查看表统计信息
SHOW STATS_META WHERE table_name = 'users';
-- 查看列统计信息
SHOW STATS_HISTOGRAMS WHERE table_name = 'users';
-- 查看直方图
SHOW STATS_BUCKETS WHERE table_name = 'users' AND column_name = 'status';
-- 手动收集统计信息
ANALYZE TABLE users;
-- 收集指定列
ANALYZE TABLE users COLUMNS id, status;
-- 设置采样率
SET SESSION tidb_analyze_version = 2;
ANALYZE TABLE users WITH 10000 SAMPLERATE;
四、执行引擎 #
4.1 执行器架构 #
text
执行器架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ 执行计划 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 执行器构建 │ │
│ │ │ │
│ │ Plan → Executor │ │
│ │ │ │
│ │ ┌───────────────┐ │ │
│ │ │ Projection │ │ │
│ │ │ Executor │ │ │
│ │ └───────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────┴───────┐ │ │
│ │ │ Selection │ │ │
│ │ │ Executor │ │ │
│ │ └───────┬───────┘ │ │
│ │ │ │ │
│ │ ┌───────┴───────┐ │ │
│ │ │ TableReader │ │ │
│ │ │ Executor │ │ │
│ │ └───────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 数据流转 │ │
│ │ │ │
│ │ 火山模型: Next() 调用链 │ │
│ │ │ │
│ │ 向量化执行: 批量处理 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 火山模型 #
text
火山模型执行过程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 查询: SELECT name FROM users WHERE id = 1 │
│ │
│ 执行器树: │
│ │
│ ┌───────────────┐ │
│ │ Projection │ ← Next() 返回 name │
│ │ Executor │ │
│ └───────┬───────┘ │
│ │ 调用 Next() │
│ ┌───────┴───────┐ │
│ │ Selection │ ← 过滤 id = 1 │
│ │ Executor │ │
│ └───────┬───────┘ │
│ │ 调用 Next() │
│ ┌───────┴───────┐ │
│ │ TableReader │ ← 从 TiKV 读取数据 │
│ │ Executor │ │
│ └───────────────┘ │
│ │
│ 执行流程: │
│ 1. Projection 调用 Selection.Next() │
│ 2. Selection 调用 TableReader.Next() │
│ 3. TableReader 返回一行数据 │
│ 4. Selection 检查条件,返回符合的行 │
│ 5. Projection 提取 name 列 │
│ 6. 重复直到没有数据 │
│ │
└─────────────────────────────────────────────────────────────┘
4.3 向量化执行 #
text
向量化执行
┌─────────────────────────────────────────────────────────────┐
│ │
│ 传统执行 (逐行): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ for row in table: │ │
│ │ if condition(row): │ │
│ │ result.append(project(row)) │ │
│ │ │ │
│ │ 问题: 函数调用开销大,CPU缓存效率低 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 向量化执行 (批量): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ batch = fetch_batch(1024) # 一次取1024行 │ │
│ │ mask = condition_batch(batch) # 批量过滤 │ │
│ │ result = project_batch(batch[mask]) # 批量投影 │ │
│ │ │ │
│ │ 优势: 减少函数调用,提高CPU缓存命中率 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
五、分布式执行 #
5.1 分布式执行框架 #
text
分布式执行架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 查询优化器 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 执行计划 │ │ │
│ │ │ │ │ │
│ │ │ Root Task (协调者) │ │ │
│ │ │ │ │ │ │
│ │ │ ┌────┴────────────────────┐ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ▼ ▼ │ │ │
│ │ │ Cop Task 1 Cop Task 2 │ │ │
│ │ │ (TiKV 1) (TiKV 2) │ │ │
│ │ │ │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ TiKV 1 │ │ TiKV 2 │ │ TiKV 3 │ │
│ │ │ │ │ │ │ │
│ │ Coprocessor │ │ Coprocessor │ │ Coprocessor │ │
│ │ - 过滤 │ │ - 过滤 │ │ - 过滤 │ │
│ │ - 聚合 │ │ - 聚合 │ │ - 聚合 │ │
│ │ - 排序 │ │ - 排序 │ │ - 排序 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
5.2 Coprocessor下推 #
sql
-- 查询示例
SELECT COUNT(*), AVG(amount)
FROM orders
WHERE status = 'completed' AND created_at > '2024-01-01';
-- 执行计划
EXPLAIN SELECT COUNT(*), AVG(amount)
FROM orders
WHERE status = 'completed' AND created_at > '2024-01-01';
text
Coprocessor 下推过程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 不下推 (传统方式): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ TiKV 1 → 返回 100万行 → TiDB │ │
│ │ TiKV 2 → 返回 100万行 → TiDB │ │
│ │ TiKV 3 → 返回 100万行 → TiDB │ │
│ │ │ │
│ │ TiDB: 过滤 + 聚合 (处理300万行) │ │
│ │ │ │
│ │ 问题: 网络传输大量数据 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 下推 (优化方式): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ TiKV 1: 过滤 + 聚合 → 返回 1 行结果 │ │
│ │ TiKV 2: 过滤 + 聚合 → 返回 1 行结果 │ │
│ │ TiKV 3: 过滤 + 聚合 → 返回 1 行结果 │ │
│ │ │ │
│ │ TiDB: 汇总 3 行结果 │ │
│ │ │ │
│ │ 优势: 大幅减少网络传输 │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
5.3 MPP执行 #
text
MPP (Massively Parallel Processing) 执行
┌─────────────────────────────────────────────────────────────┐
│ │
│ 查询: │
│ SELECT region, SUM(amount) │
│ FROM orders │
│ GROUP BY region; │
│ │
│ MPP 执行计划: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────┐ │ │
│ │ │ 查询协调器 │ │ │
│ │ └─────────────────────────────────────────────┘ │ │
│ │ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ TiFlash 1 │ │ TiFlash 2 │ │ TiFlash 3 │ │
│ │ │ │ │ │ │ │
│ │ 本地聚合 │ │ 本地聚合 │ │ 本地聚合 │ │
│ │ region A │ │ region B │ │ region C │ │
│ │ SUM = 1000 │ │ SUM = 2000 │ │ SUM = 3000 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
│ 特点: │
│ - 每个 TiFlash 独立执行部分计算 │
│ - 没有单点瓶颈 │
│ - 线性扩展能力 │
│ │
└─────────────────────────────────────────────────────────────┘
sql
-- 启用 MPP
SET SESSION tidb_allow_mpp = 1;
-- 强制使用 MPP
SET SESSION tidb_enforce_mpp = 1;
-- 查看 MPP 执行计划
EXPLAIN SELECT region, SUM(amount)
FROM orders
GROUP BY region;
六、执行计划分析 #
6.1 查看执行计划 #
sql
-- 基本执行计划
EXPLAIN SELECT * FROM users WHERE id = 1;
-- 详细执行计划
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;
-- 格式化输出
EXPLAIN FORMAT = 'row' SELECT * FROM users WHERE id = 1;
EXPLAIN FORMAT = 'brief' SELECT * FROM users WHERE id = 1;
EXPLAIN FORMAT = 'dot' SELECT * FROM users WHERE id = 1;
6.2 执行计划解读 #
text
执行计划示例
┌─────────────────────────────────────────────────────────────┐
│ │
│ id │ task │ operator info │
│ ─────────────────────┼──────┼────────────────────────── │
│ Projection_4 │ root │ name │
│ └─Selection_5 │ root │ eq(id, 1) │
│ └─TableReader_7 │ root │ data: Selection_6 │
│ └─Selection_6 │ cop │ eq(id, 1) │
│ └─TableScan_8 │ cop │ table:users, range:[1,1] │
│ │
│ 解读: │
│ 1. TableScan_8: 扫描 users 表,范围 [1, 1] │
│ 2. Selection_6: 在 TiKV 上过滤 id = 1 │
│ 3. TableReader_7: 从 TiKV 读取数据 │
│ 4. Selection_5: 在 TiDB 上再次过滤 │
│ 5. Projection_4: 投影 name 列 │
│ │
│ task 说明: │
│ - root: 在 TiDB Server 执行 │
│ - cop: 在 TiKV Coprocessor 执行 │
│ │
└─────────────────────────────────────────────────────────────┘
6.3 常见算子 #
| 算子 | 说明 |
|---|---|
| TableScan | 全表扫描 |
| IndexScan | 索引扫描 |
| IndexReader | 索引读取 |
| TableReader | 表数据读取 |
| Selection | 过滤 |
| Projection | 投影 |
| HashJoin | Hash 连接 |
| MergeJoin | Merge 连接 |
| IndexJoin | 索引连接 |
| HashAgg | Hash 聚合 |
| StreamAgg | 流式聚合 |
| Sort | 排序 |
| TopN | Top N |
| Limit | 限制行数 |
6.4 优化Hints #
sql
-- 使用索引
SELECT /*+ USE_INDEX(users idx_status) */
* FROM users WHERE status = 'active';
-- 强制索引
SELECT /*+ FORCE_INDEX(users idx_status) */
* FROM users WHERE status = 'active';
-- 不使用索引
SELECT /*+ IGNORE_INDEX(users idx_status) */
* FROM users WHERE status = 'active';
-- Join 顺序
SELECT /*+ LEADING(orders, users) */
u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id;
-- Join 方式
SELECT /*+ HASH_JOIN(u, o) */
u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id;
-- 并行度
SELECT /*+ MAX_EXECUTION_TIME(10000) */
* FROM large_table;
-- 内存限制
SELECT /*+ MEMORY_QUOTA(1 GB) */
* FROM large_table GROUP BY col1;
七、配置调优 #
7.1 内存配置 #
sql
-- 查看内存配置
SHOW VARIABLES LIKE '%memory%';
-- 设置内存限制
SET GLOBAL tidb_server_memory_limit = "80%";
-- 查询内存使用
SET GLOBAL tidb_server_memory_limit_gc_trigger = 0.7;
7.2 并行配置 #
sql
-- 并发执行
SET SESSION tidb_distsql_scan_concurrency = 15;
SET SESSION tidb_index_lookup_concurrency = 15;
SET SESSION tidb_hash_join_concurrency = 5;
-- MPP 配置
SET SESSION tidb_max_tiflash_threads = 4;
7.3 缓存配置 #
sql
-- Prepared Plan Cache
SET SESSION tidb_enable_prepared_plan_cache = ON;
SET SESSION tidb_prepared_plan_cache_size = 100;
-- 统计信息缓存
SET GLOBAL tidb_stats_cache_mem_quota = 2000000000;
八、总结 #
TiDB Server 核心要点:
| 模块 | 要点 |
|---|---|
| SQL解析 | 词法分析 → 语法分析 → AST |
| 查询优化 | 逻辑优化 → 物理优化 → 执行计划 |
| 执行引擎 | 火山模型 → 向量化执行 |
| 分布式执行 | Coprocessor下推 → MPP并行 |
| 调优 | 统计信息 → Hints → 配置 |
下一步,让我们深入学习 TiKV 存储引擎!
最后更新:2026-03-27