Skip to content

TiDB 面试汇总:高频问题与深度解答

TiDB 是近年来非常火热的分布式数据库,面试中经常被问到。

本篇汇总 TiDB 面试的高频问题,从浅入深,帮助你全面准备。

一、基础概念类

Q1:TiDB 的整体架构是怎样的?

TiDB 由三个核心组件构成:

┌─────────────────────────────────────────────────────────┐
│                     TiDB 数据库                          │
│                                                         │
│  ┌─────────────────┐     ┌─────────────────┐           │
│  │  TiDB Server   │     │      PD         │           │
│  │   (SQL 层)    │◄───►│   (调度层)     │           │
│  └────────┬────────┘     └────────┬────────┘           │
│           │                       │                     │
│           └───────────┬───────────┘                     │
│                       ▼                                  │
│  ┌─────────────────────────────────────────────────┐   │
│  │                  TiKV(存储层)                  │   │
│  │  - 数据存储                                     │   │
│  │  - Raft 复制                                    │   │
│  │  - MVCC 事务                                    │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘
  • TiDB Server:SQL 解析、优化、执行,无状态,可水平扩展
  • TiKV:分布式 KV 存储引擎,Raft 多数派复制
  • PD:调度中心,管理元信息、分配 TSO、调度数据分布

Q2:TiDB 和 NewSQL 是什么关系?

NewSQL = NoSQL 的扩展性 + 传统数据库的 ACID。

特性传统数据库NoSQLNewSQL
水平扩展困难简单简单
ACID支持通常不支持支持
SQL支持不支持支持
典型产品MySQLMongoDBTiDB, CockroachDB

Q3:TiDB 和 TiKV 的关系是什么?

TiDB = TiDB Server + TiKV + PD

可以理解为:

  • TiDB Server = MySQL(计算层)
  • TiKV = InnoDB(存储层)
  • PD = MySQL 运维工具(调度层)

TiKV 也可以单独使用,作为分布式 KV 存储(如替代 etcd)。


二、存储引擎类

Q4:TiKV 的数据分片机制是怎样的?

TiKV 使用 Region 作为数据分片的基本单位:

java
// Region 的核心概念
public class Region {
    private byte[] startKey;  // 起始 Key(包含)
    private byte[] endKey;    // 结束 Key(不包含)
    private List<Peer> peers; // Raft 副本
    private Peer leader;      // 当前 Leader
}
// 每个 Region 默认 96MB
// 大于阈值会自动分裂
// 小于阈值会尝试合并

为什么用 Key 范围分片而不是 Hash 分片?

  • 范围分片支持有序遍历(BETWEEN 查询更高效)
  • Hash 分片在范围查询时需要扫描所有节点

Q5:Raft 协议在 TiKV 中如何实现?

Raft 是 TiKV 一致性的基石:

java
// Raft 的核心机制
public class RaftProtocol {
    // 1. Leader 选举
    // Follower 收不到心跳 → 变成 Candidate → 发起选举
    // 获得多数票的节点成为 Leader

    // 2. 日志复制
    // 所有写入经过 Leader → 复制到 Follower → 多数派确认后 apply

    // 3. 成员变更
    // 增删节点通过 Raft 协议完成,保证安全性
}

TiKV 的 Multi-Raft 优化

  • 不是整个集群一个 Raft Group
  • 每个 Region 有独立的 Raft Group
  • 不同 Region 可以有不同的 Leader,实现真正的分布式写入

Q6:MVCC 是如何实现的?

TiKV 使用 MVCC 实现并发控制:

java
// MVCC 的核心思想
public class MVCC {
    // Key = user_key + start_ts
    // Value = {commit_ts, data, lock}

    // 读取时:
    // 返回所有 commit_ts <= startTs 的最新版本

    // 写入时:
    // Prewrite: 写入数据 + 锁
    // Commit: 写入 commit_ts,释放锁
}

TSO(Timestamp Oracle)

  • PD 分配全局唯一时间戳
  • 一次 SQL 事务有两个时间戳:start_tscommit_ts
  • 事务看到的是 start_ts 时刻的数据库快照

Q7:热点问题如何解决?

热点是分布式数据库的常见问题:

热点类型解决方案
写入热点使用 AUTO_RANDOM 代替自增主键
读取热点PD 自动迁移 Leader 到冷节点
索引热点创建合适的二级索引分散访问
sql
-- 使用 AUTO_RANDOM 解决写入热点
CREATE TABLE orders (
    id BIGINT PRIMARY KEY AUTO_RANDOM,
    ...
);

三、SQL 引擎类

Q8:TiDB 的查询优化器是怎么工作的?

TiDB 优化器分两个阶段:

java
// 阶段 1:逻辑优化
public class LogicalOptimization {
    // 谓词下推:把过滤条件推到 TiKV 层
    // 列裁剪:只读取需要的列
    // 聚合下推:先在 TiKV 层聚合
    // JOIN 重排:根据数据量选择最优顺序
}

// 阶段 2:物理优化
public class PhysicalOptimization {
    // 枚举可能的物理计划
    // 代价估算
    // 选择代价最低的计划
}

Q9:TiDB 支持哪些 JOIN 类型?

JOIN 类型适用场景
Hash Join大表 JOIN 小表
Merge Join已排序的数据
Index Look Up Join有索引的小表 JOIN 大表

TiFlash 还支持 MPP JOIN,多个 TiFlash 节点并行计算。

Q10:悲观事务和乐观事务怎么选?

事务模式适用场景
乐观事务低并发、冲突少(如日志、表单提交)
悲观事务高并发、冲突多(如库存扣减、转账)
sql
-- TiDB 默认使用乐观事务
-- 可以切换到悲观事务
SET GLOBAL tidb_txn_mode = 'pessimistic';

四、HTAP 类

Q11:TiFlash 和 TiKV 的区别是什么?

特性TiKVTiFlash
存储格式行存列存
一致性强一致最终一致
查询类型点查聚合
写入方式同步异步同步

Q12:MPP 是什么?什么时候用?

MPP(Massively Parallel Processing)让多个 TiFlash 节点并行计算:

sql
-- 开启 MPP 模式
SET SESSION tidb_enforce_mpp = on;

-- 大表 JOIN 自动使用 MPP
SELECT a.*, SUM(b.amount)
FROM large_table_a a
JOIN large_table_b b ON a.id = b.id
GROUP BY a.id;

适合场景:复杂聚合、多表 JOIN、大数据量分析 不适合场景:简单点查、强一致性要求

Q13:HTAP 场景下如何选型?

OLTP 为主 + 简单 OLAP → TiKV 足够
复杂 OLAP + 大数据量 → TiFlash + MPP
需要 Spark 生态 → TiSpark

五、运维管理类

Q14:如何监控 TiDB 集群?

TiDB 的监控体系:

监控组件说明
Grafana可视化展示
Prometheus指标收集存储
TiDB DashboardWeb 诊断界面

关键监控指标:

  • TiDB Server:QPS、延迟、连接数
  • TiKV:Leader 分布、Region 健康度、磁盘使用
  • PD:调度状态、TSO 延迟

Q15:如何进行备份恢复?

TiDB 使用 BR(Backup & Restore) 工具:

bash
# 全量备份
br backup full \
    --pd 192.168.1.1:2379 \
    --storage "s3://bucket/backup"

# 恢复
br restore full \
    --pd 192.168.1.1:2379 \
    --storage "s3://bucket/backup"

Q16:扩缩容会影响服务吗?

不会。TiDB 的扩缩容是在线完成的:

  • TiKV 扩容:PD 自动迁移 Region 到新节点
  • TiKV 缩容:先迁移数据,再下线节点
  • TiDB Server 扩容:无状态,直接加节点

六、高频追问类

Q17:TiDB 和 CockroachDB 的区别?

维度TiDBCockroachDB
兼容性MySQLPostgreSQL
存储引擎TiKV(自研)RocksDB
HTAP支持(TiFlash)不支持
社区活跃度

选择建议:已有 MySQL 经验选 TiDB,已有 PostgreSQL 经验选 CockroachDB。

Q18:TiDB 的扩展上限是多少?

官方数据:

  • TiKV 节点:100+ 节点
  • 数据容量:PB 级
  • QPS:百万级

实际上限取决于:

  • 数据分布是否均匀
  • 查询复杂度
  • 网络带宽

Q19:什么时候不适合用 TiDB?

场景原因替代方案
超高并发点查网络开销大Redis + MySQL
海量冷数据存储成本高对象存储 + Presto
强事务 + 超大数据量分布式事务开销大分库分表
复杂全文检索不支持全文索引Elasticsearch

Q20:如何定位 TiDB 慢查询?

sql
-- 1. 查看执行计划
EXPLAIN ANALYZE <slow_query>;

-- 2. 查看 Top SQL
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_STATEMENTS_SUMMARY
ORDER BY SUM_LATENCY DESC LIMIT 10;

-- 3. 查看正在执行的查询
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_PROCESSLIST
WHERE Time > 10;

-- 4. TiDB Dashboard
-- Key Visualizer:分析热点
-- SQL Statement:查看慢查询

七、思维深度类

Q21:TiDB 如何保证分布式一致性?

TiDB 的分布式一致性通过多层机制保证:

应用层 ──────────────────────────────
        分布式事务(Percolator)


        MVCC + TSO


        Raft 复制


        RocksDB 持久化

Percolator 模型

  • 去中心化的事务协调
  • 主键机制保证原子性
  • MVCC 实现快照隔离

Q22:TiDB 的调度策略是怎样的?

PD 是 TiDB 的调度中心:

调度目标说明
负载均衡Region 数量均匀分布
热点分散Leader 分布均衡
副本隔离不同 AZ/机架的副本
容量管理Region 分裂与合并

调度是通过 Operator 实现的:

  • AddPeer / RemovePeer:增删副本
  • TransferLeader:迁移 Leader
  • Split / Merge:分裂合并 Region

Q23:TiDB 的 SQL 引擎如何与存储层交互?

java
// TiDB Server 接收 SQL
// SQL 解析 → 优化 → 生成分布式执行计划
// 执行计划被拆分成多个子任务
// 每个子任务发送到对应的 Region Leader
// TiKV 并行执行,返回结果
// TiDB Server 聚合结果

算子下推是关键优化:

  • Filter 下推:减少数据传输
  • 聚合下推:减少计算量
  • 索引下推:减少回表

八、实战经验类

Q24:生产环境遇到过什么问题?如何解决?

常见生产问题:

问题原因解决方案
写入热点自增主键AUTO_RANDOM
查询超时缺少索引ADD INDEX
Region 不均衡新节点加入等待 PD 调度
同步延迟高TiFlash 负载高增加 TiFlash 节点

Q25:如何规划 TiDB 集群容量?

容量规划要素:

组件规划要点
TiKV数据量 × 3 副本 × 1.5 冗余 = 存储容量
TiDB ServerQPS × 0.1 = CPU 核心数
PD3 节点,etcd 数据量小
TiFlash分析数据量 / 压缩比

Q26:从 MySQL 迁移到 TiDB 的注意事项?

注意事项说明
自增主键TiDB 推荐 AUTO_RANDOM
外键约束功能有限,需评估
存储过程不支持复杂存储过程
分区表使用有限制,需测试
字符集UTF8MB4 完全支持

总结

TiDB 面试的核心知识点:

┌─────────────────────────────────────────────────────────┐
│                     TiDB 知识体系                        │
│                                                         │
│  架构原理 ────────────────────────────────────────      │
│  ├── TiDB Server / TiKV / PD 的职责                    │
│  ├── Region 分片机制                                    │
│  └── 存储计算分离架构                                   │
│                                                         │
│  核心技术 ────────────────────────────────────────      │
│  ├── Raft 协议与 Multi-Raft                            │
│  ├── MVCC 与 TSO                                       │
│  ├── Percolator 分布式事务                              │
│  └── SQL 引擎与算子下推                                 │
│                                                         │
│  HTAP 能力 ────────────────────────────────────────    │
│  ├── TiFlash 列式存储                                  │
│  ├── MPP 并行查询                                       │
│  └── TiSpark 集成                                       │
│                                                         │
│  运维实践 ────────────────────────────────────────      │
│  ├── 扩缩容与调度                                       │
│  ├── 监控与故障排查                                     │
│  └── 备份恢复                                           │
│                                                         │
└─────────────────────────────────────────────────────────┘

面试回答的技巧:

  • 概念清晰:能用简洁的语言解释核心概念
  • 深入理解:知道原理和 trade-off
  • 实战经验:有生产环境的经验加分
  • 举一反三:能把 TiDB 的设计和其他系统类比

祝面试顺利!

基于 VitePress 构建