TiFlash列存引擎 #
一、TiFlash概述 #
1.1 核心定位 #
TiFlash 是 TiDB 的列存引擎,提供 HTAP (混合事务/分析处理) 能力。
text
TiFlash 核心特性
├── 列式存储
│ ├── 高效压缩
│ ├── 向量化执行
│ └── 分析查询优化
│
├── 实时同步
│ ├── Raft Learner 角色
│ ├── 异步复制
│ └── 强一致性读
│
├── HTAP 能力
│ ├── 事务分析一体
│ ├── 互不干扰
│ └── 实时分析
│
└── MPP 执行
├── 分布式计算
├── 并行处理
└── 线性扩展
1.2 HTAP架构 #
text
HTAP 混合负载架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ 应用请求 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ TiDB Server │ │
│ │ │ │
│ │ 优化器自动选择: │ │
│ │ ├── OLTP 请求 → TiKV (行存) │ │
│ │ └── OLAP 请求 → TiFlash (列存) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ TiKV │ │ TiFlash │ │
│ │ 行存 │ │ 列存 │ │
│ │ │ │ │ │
│ │ OLTP │ │ OLAP │ │
│ │ 点查/事务 │ │ 分析查询 │ │
│ │ │ │ 聚合计算 │ │
│ └─────────────┘ └─────────────┘ │
│ │ ▲ │
│ │ │ │
│ └───── Raft 同步 ─────┘ │
│ │
│ 特点: │
│ - 数据实时同步,无延迟 │
│ - 一套系统两种负载 │
│ - 事务分析互不干扰 │
│ │
└─────────────────────────────────────────────────────────────┘
二、列式存储 #
2.1 行存vs列存 #
text
行存 vs 列存对比
┌─────────────────────────────────────────────────────────────┐
│ │
│ 行存 (TiKV) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Row1: [id, name, age, email, address, phone] │ │
│ │ Row2: [id, name, age, email, address, phone] │ │
│ │ Row3: [id, name, age, email, address, phone] │ │
│ │ Row4: [id, name, age, email, address, phone] │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 适合: │
│ ├── 点查询 (SELECT * FROM users WHERE id = 1) │
│ ├── 事务处理 (INSERT, UPDATE, DELETE) │
│ └── 需要所有列的场景 │
│ │
│ ───────────────────────────────────────────────────── │
│ │
│ 列存 (TiFlash) │
│ ┌─────────┬─────────┬─────────┬─────────┬─────────┐ │
│ │ id │ name │ age │ email │ address │ │
│ ├─────────┼─────────┼─────────┼─────────┼─────────┤ │
│ │ 1 │ Alice │ 25 │ a@x.com │ Beijing │ │
│ │ 2 │ Bob │ 30 │ b@x.com │ Shanghai│ │
│ │ 3 │ Carol │ 28 │ c@x.com │ Guangzhou│ │
│ │ 4 │ David │ 35 │ d@x.com │ Shenzhen│ │
│ └─────────┴─────────┴─────────┴─────────┴─────────┘ │
│ │
│ 适合: │
│ ├── 分析查询 (SELECT age, COUNT(*) FROM users GROUP BY age)│
│ ├── 聚合计算 (SUM, AVG, COUNT) │
│ └── 只需要少数列的场景 │
│ │
└─────────────────────────────────────────────────────────────┘
2.2 列存优势 #
text
列存优势详解
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 只读取需要的列 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 查询: SELECT name, age FROM users │ │
│ │ │ │
│ │ 行存: 读取所有列 (id, name, age, email, ...) │ │
│ │ 列存: 只读取 name, age 两列 │ │
│ │ │ │
│ │ IO 节省: 60%+ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 2. 更好的数据压缩 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 同一列数据类型相同,压缩率更高 │ │
│ │ │ │
│ │ age 列: [25, 30, 28, 35, ...] │ │
│ │ 压缩算法: RLE, Dictionary, Delta │ │
│ │ 压缩率: 5-10x │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ 3. 向量化执行 │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 批量处理数据,减少函数调用开销 │ │
│ │ │ │
│ │ 传统: for row in rows: process(row) │ │
│ │ 向量化: process_batch(column_data) │ │
│ │ │ │
│ │ 性能提升: 2-10x │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
三、数据同步 #
3.1 Raft Learner #
text
TiFlash 作为 Raft Learner
┌─────────────────────────────────────────────────────────────┐
│ │
│ Raft Group 结构: │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ┌─────────┐ │ │
│ │ │ TiKV 1 │ Leader (Voter) │ │
│ │ │ │ - 处理读写请求 │ │
│ │ │ │ - 参与投票 │ │
│ │ └─────────┘ │ │
│ │ │ │ │
│ │ │ 复制日志 │ │
│ │ ▼ │ │
│ │ ┌─────────┐ ┌─────────┐ │ │
│ │ │ TiKV 2 │ │ TiKV 3 │ Follower (Voter) │ │
│ │ │ │ │ │ - 参与投票 │ │
│ │ └─────────┘ └─────────┘ │ │
│ │ │ │ │
│ │ │ 复制日志 │ │
│ │ ▼ │ │
│ │ ┌─────────┐ │ │
│ │ │TiFlash │ Learner │ │
│ │ │ │ - 只同步数据 │ │
│ │ │ │ - 不参与投票 │ │
│ │ │ │ - 不影响 TiKV 性能 │ │
│ │ └─────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Learner 特点: │
│ - 不参与 Leader 选举 │
│ - 不影响 Raft 写入性能 │
│ - 数据强一致 │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 一致性保证 #
sql
-- TiFlash 支持强一致性读
-- 查询时会确保数据版本一致
-- 查看同步状态
SELECT * FROM INFORMATION_SCHEMA.TIFLASH_REPLICA;
-- 为表添加 TiFlash 副本
ALTER TABLE users SET TIFLASH REPLICA 1;
-- 查看副本同步进度
SELECT TABLE_NAME, REPLICA_COUNT, AVAILABLE
FROM INFORMATION_SCHEMA.TIFLASH_REPLICA;
四、MPP执行 #
4.1 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 1-10 │ │ Region 11-20 │ │ Region 21-30 │ │
│ │ │ │ │ │ │ │
│ │ 本地聚合: │ │ 本地聚合: │ │ 本地聚合: │ │
│ │ region A │ │ region B │ │ region C │ │
│ │ SUM = 1000 │ │ SUM = 2000 │ │ SUM = 3000 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │
│ 特点: │
│ - 每个 TiFlash 独立执行部分计算 │
│ - 没有单点瓶颈 │
│ - 线性扩展能力 │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 启用MPP #
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;
-- 查看是否使用 TiFlash
EXPLAIN SELECT /*+ READ_FROM_STORAGE(TIFLASH[orders]) */
* FROM orders WHERE amount > 1000;
五、使用TiFlash #
5.1 创建TiFlash副本 #
sql
-- 为表添加 TiFlash 副本
ALTER TABLE users SET TIFLASH REPLICA 1;
-- 为数据库所有表添加副本
ALTER DATABASE mydb SET TIFLASH REPLICA 1;
-- 查看副本状态
SELECT
TABLE_SCHEMA,
TABLE_NAME,
REPLICA_COUNT,
AVAILABLE,
PROGRESS
FROM INFORMATION_SCHEMA.TIFLASH_REPLICA;
-- 删除 TiFlash 副本
ALTER TABLE users SET TIFLASH REPLICA 0;
5.2 查询优化 #
sql
-- 强制使用 TiFlash
SELECT /*+ READ_FROM_STORAGE(TIFLASH[users]) */
* FROM users WHERE age > 25;
-- 分析查询自动使用 TiFlash
SELECT
region,
COUNT(*) as order_count,
SUM(amount) as total_amount,
AVG(amount) as avg_amount
FROM orders
WHERE created_at >= '2024-01-01'
GROUP BY region
ORDER BY total_amount DESC;
-- 查看执行计划确认使用 TiFlash
EXPLAIN ANALYZE
SELECT region, SUM(amount) FROM orders GROUP BY region;
5.3 数据同步监控 #
sql
-- 查看同步进度
SELECT
TABLE_NAME,
REPLICA_COUNT,
AVAILABLE,
PROGRESS
FROM INFORMATION_SCHEMA.TIFLASH_REPLICA
WHERE TABLE_SCHEMA = 'mydb';
-- 查看同步延迟
SHOW TABLE STATUS WHERE Name = 'users';
六、配置调优 #
6.1 关键配置 #
yaml
# TiFlash 配置示例
[flash]
tidb_status_addr = "tidb:10080"
service_addr = "0.0.0.0:3930"
[flash.flash_cluster]
update_rule_interval = 5
master_ttl = 60
[flash.proxy]
addr = "0.0.0.0:20170"
advertise-addr = "tiflash:20170"
data-dir = "/data/tiflash/proxy"
[logger]
level = "info"
log = "/log/tiflash.log"
[profiles]
[profiles.default]
max_memory_usage = 10000000000 # 10GB
6.2 内存管理 #
sql
-- 设置内存限制
SET GLOBAL tidb_server_memory_limit = "80%";
-- 单查询内存限制
SET SESSION tidb_mem_quota_query = 1073741824; -- 1GB
七、最佳实践 #
7.1 使用场景 #
text
TiFlash 适用场景
┌─────────────────────────────────────────────────────────────┐
│ │
│ 适合场景: │
│ ├── 实时报表分析 │
│ ├── 数据仓库查询 │
│ ├── BI 分析 │
│ ├── 实时大屏 │
│ └── 复杂聚合查询 │
│ │
│ 不适合场景: │
│ ├── 点查询 (使用 TiKV) │
│ ├── 高并发事务 (使用 TiKV) │
│ └── 需要最新数据的实时查询 │
│ │
└─────────────────────────────────────────────────────────────┘
7.2 性能优化建议 #
text
TiFlash 性能优化建议
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 合理设置副本数 │
│ ├── 生产环境建议 2+ 副本 │
│ └── 根据查询负载调整 │
│ │
│ 2. 监控同步延迟 │
│ ├── 确保数据及时同步 │
│ └── 关注 PROGRESS 指标 │
│ │
│ 3. 使用 MPP 模式 │
│ ├── 大查询启用 MPP │
│ └── 充分利用分布式计算 │
│ │
│ 4. 内存管理 │
│ ├── 设置合理的内存限制 │
│ └── 避免单查询占用过多内存 │
│ │
└─────────────────────────────────────────────────────────────┘
八、总结 #
TiFlash 核心要点:
| 模块 | 要点 |
|---|---|
| 列式存储 | 高压缩、向量化、分析优化 |
| 数据同步 | Raft Learner、强一致性 |
| HTAP | 事务分析一体、互不干扰 |
| MPP | 分布式计算、线性扩展 |
下一步,让我们学习数据操作!
最后更新:2026-03-27