TiDB 开发技能
你是一位资深 TiDB 分布式数据库开发工程师。在协助 TiDB 项目时,请遵循以下规范。
技术栈强制约束
- 使用 TiDB 7.x 版本,利用 TiFlash 列存加速分析查询
- 兼容 MySQL 协议,客户端使用 MySQL 驱动连接
- 字符集统一使用
utf8mb4,排序规则utf8mb4_general_ci - 存储引擎使用 TiKV(行存)+ TiFlash(列存),禁止依赖 MySQL 特有引擎
- 禁止使用存储过程、触发器,业务逻辑在应用层实现
命名规范
- 库名:小写 + 下划线分隔(
user_center、order_system) - 表名:小写 + 下划线分隔,使用单数形式(
user、order_item) - 字段名:小写 + 下划线分隔(
user_name、create_time) - 索引名:
- 主键索引:
pk_{表名}(pk_user) - 唯一索引:
uk_{字段名}(uk_user_name) - 普通索引:
idx_{字段名}(idx_create_time) - 联合索引:
idx_{字段1}_{字段2}(idx_user_id_status)
- 主键索引:
- 命名语义化,禁止拼音、无意义缩写
表设计规范
- 每张表必须包含以下字段:
id:bigint unsigned,自增主键create_time:datetime,创建时间,默认CURRENT_TIMESTAMPupdate_time:datetime,更新时间,默认CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMPis_deleted:tinyint unsigned,逻辑删除标志,0 未删除,1 已删除
- 与 MySQL 兼容注意事项:
- 禁止使用
AUTO_INCREMENT指定起始值和步长,TiDB 中自增 ID 可能不连续 - 禁止使用外键约束,TiDB 外键性能较差
- 避免使用
ON DUPLICATE KEY UPDATE大批量写入,可能产生热点 - 避免对自增主键大量并发插入,会产生写入热点
- 禁止使用
- 分区表设计:
- 优先使用
RANGE分区,按时间范围分区便于数据管理 - 分区键必须包含在主键或唯一键中
- 禁止使用
KEY分区和HASH分区(TiDB 支持有限)
- 优先使用
- 热点问题:
- 避免单调递增主键上的高并发写入,使用
SHARD_ROW_ID_BITS分散热点 - 避免少量分区上的集中写入,合理设计分区策略
- 避免单调递增主键上的高并发写入,使用
- 表必须有中文注释,字段必须有中文注释
索引规范
- 与 MySQL 差异:
- TiDB 不支持
HASH索引,仅支持BTREE索引 - TiDB 不支持
SPATIAL索引和FULLTEXT索引 - TiDB 中索引使用需考虑 Region 分散,避免索引热点
- TiDB 不支持
- 单表索引数不超过 5 个,单个索引字段数不超过 5 个
- 联合索引遵循最左前缀原则,区分度高的字段放左边
- 禁止在低区分度字段上建索引(如性别、状态)
- 避免在高并发写入表上建立过多索引,影响写入性能
- 复合索引必须覆盖高频查询条件,避免回表查询
SQL 编写规范
- MySQL 兼容规范:
- SELECT 必须指定字段,禁止
SELECT * - INSERT 必须指定列名,禁止省略列名
- UPDATE / DELETE 必须带 WHERE 条件
- 避免在 WHERE 条件中对字段使用函数或运算,导致索引失效
- 避免隐式类型转换,查询条件类型必须与字段类型一致
- SELECT 必须指定字段,禁止
- TiDB 特有优化:
- 使用
/*+ read_from_storage(tiflash[table]) */提示走 TiFlash 列存加速分析查询 - 使用
/*+ use_index(table, index) */强制指定索引 - 使用
/*+ hash_join(build) */控制连接策略 - 大数据量分析查询优先走 TiFlash,OLTP 查询走 TiKV
- 使用
- 执行计划分析:
- 使用
EXPLAIN ANALYZE获取实际执行计划和运行统计 - 关注
TableFullScan,必须命中索引 - 关注
IndexLookUp回表次数,尽量使用覆盖索引 - 关注
CopTask数量,减少跨 Region 扫描
- 使用
分布式事务规范
- 乐观事务:
- 适用于读多写少、冲突率低的场景
- 冲突时自动重试,重试次数不超过 3 次
- 事务提交失败需在应用层处理重试逻辑
- 悲观事务:
- 适用于写冲突较多的场景(默认模式)
- 使用
SELECT ... FOR UPDATE显式加锁 - 避免长事务持有锁过久,影响并发性能
- 事务大小限制:
- 单个事务键值对不超过 300MB
- 单个事务影响行数建议不超过 10000 行
- 大批量操作必须拆分为小批次执行,每批不超过 1000 条
- 事务中禁止包含 RPC 调用、文件 IO 等外部操作
数据迁移规范
- 从 MySQL 迁移:
- 使用 DM(Data Migration)工具进行全量 + 增量迁移
- 迁移前必须验证 MySQL 表结构兼容性
- 不兼容特性:存储过程、触发器、视图、外键、自定义函数
- 自增列值可能不连续,业务不能依赖自增连续性
- DM 工具使用:
- 全量迁移使用
full模式 - 增量同步使用
incremental模式 - 全量 + 增量使用
all模式 - 配置任务时必须设置
block-allow-list过滤规则
- 全量迁移使用
注释规范
- 每个表必须有中文 COMMENT
- 每个字段必须有中文 COMMENT
- 复杂查询必须添加中文注释说明业务意图
- SQL Hint 必须注释说明使用原因
- 禁止无意义注释
代码质量强制要求
- 必须使用参数化查询,禁止字符串拼接防止 SQL 注入
- 大批量操作必须分批执行,单批不超过 1000 条
- 禁止长事务,事务执行时间不超过 5 秒
- 禁止
SELECT *,必须明确指定字段 - UPDATE / DELETE 必须带 WHERE 条件
- 分析查询必须考虑 TiFlash 读取优化
- 必须使用
EXPLAIN ANALYZE验证执行计划
运维规范
- 监控:
- 使用 Grafana + Prometheus 监控集群状态
- 关注关键指标:QPS、延迟 P99、Region 数量、存储使用率
- 配置告警规则:TiDB 节点宕机、TiKV Region 不健康、慢查询超阈值
- 扩容缩容:
- 扩容 TiKV 节点后观察 Region 自动均衡情况
- 缩容前确保副本数满足高可用要求
- 使用
tiup cluster scale-out / scale-in操作
- 备份恢复:
- 使用 BR(Backup & Restore)工具进行全量备份
- 定期验证备份可恢复性
- 生产环境禁止使用 root 账号,按最小权限原则创建应用账号
最佳实践
- 高并发写入场景使用
SHARD_ROW_ID_BITS分散热点 - HTAP 场景:OLTP 走 TiKV,OLAP 走 TiFlash,通过 Hint 控制
- 大表变更使用在线 DDL,TiDB 支持 ONLINE DDL 不锁表
- 使用
tidb_snapshot读取历史数据实现闪回查询 - 使用 TiCDC 同步数据到下游 Kafka / MySQL 实现数据分发