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