概念
TiDB 是一款开源的分布式 NewSQL 数据库,兼容 MySQL 生态,支持水平扩展、金融级高可用及实时 HTAP(混合事务分析处理)。与 OldSQL(如 MySQL)相比,它解决了单机容量和性能瓶颈;与 NoSQL 相比,提供完整的 ACID 事务和 SQL 接口。
核心特性
- MySQL 兼容:支持 MySQL 5.7 协议及常用功能,迁移成本低。
- 水平扩缩容:存储与计算分离,支持在线弹性扩缩容。
- 金融级高可用:多副本 + Multi-Raft 协议,保障数据强一致性。
- 实时 HTAP:通过 TiKV(行存)和 TiFlash(列存)支持 OLTP 与 OLAP。
- 云原生:支持 Kubernetes 部署(TiDB Operator)。
核心架构
- TiDB Server:无状态 SQL 计算层,处理 SQL 解析、优化及执行计划生成。
- TiKV Server:分布式行式存储引擎,基于 Raft 协议实现数据强一致性与高可用。
- PD Server:元数据管理与调度中枢,负责 Region 调度及全局 ID 分配。
- TiFlash Server:列式存储引擎,通过 Multi-Raft Learner 实时同步 TiKV 数据,支持实时分析。
主要限制
- 功能限制:不支持存储过程、自定义函数和触发器。
- 资源开销:分布式架构引入额外管理开销(如多副本同步)。
- 适用规模:数据量低于千万级时,单机 MySQL 可能更经济。
- 其他限制:默认单行大小 ≤6 MB(可调至 120 MB),用户名最长 32 字符。
应用场景
- 金融核心系统:需 RPO=0 和 RTO≤30 秒的高可用场景。
- 高并发 OLTP:替代分库分表,实现透明水平扩展。
- 实时 HTAP:同一份数据同时支持交易与分析(T+0)。
- 数据汇聚与报表:简化传统 Hadoop 架构,直接通过 SQL 生成报表。
Java 交互
连接与驱动
-
驱动 :使用
mysql-connector-java。 -
连接字符串 :配置多个 TiDB 节点地址以实现负载均衡。
javaString url = "jdbc:mysql://tidb-host1:4000,tidb-host2:4000/testdb?loadBalanceAutoCommitStatementThreshold=5"; -
连接池:推荐 HikariCP,配置与 MySQL 一致。
事务处理
-
乐观事务 :默认模式,提交时检测冲突,需处理重试逻辑。
javaint maxRetries = 3; for (int i = 0; i < maxRetries; i++) { try { updateAccountBalance(connection, accountId, amount); connection.commit(); break; } catch (MySQLTransactionRollbackException e) { if (i == maxRetries - 1) throw e; Thread.sleep(50); } } -
悲观事务 :通过
SET tidb_txn_mode = 'pessimistic'启用。
主键与自增 ID
- 显式主键:建议使用单调递增主键(避免写热点)。
- 自增 ID :保证唯一性但不连续,可选
AUTO_RANDOM或雪花算法。
SQL 优化
- 避免大事务:单事务数据量过大可能触发限制(默认 100MB)。
- 索引优化 :通过
EXPLAIN分析执行计划。 - 热点处理 :
-
写入热点 :使用
SHARD_ROW_ID_BITS或AUTO_RANDOM分散写入。sqlCREATE TABLE events (content TEXT) SHARD_ROW_ID_BITS = 4; -- 16 分片 -
读取热点:优化查询频率或分片键设计。
-
生态与监控
- 工具链:支持 TiUP(部署工具)、TiDB Dashboard(监控界面)。
- 监控指标:通过 Prometheus + Grafana 跟踪集群状态(如 Region 分布、事务延迟)。