外观
TiDB 性能问题
查询性能问题
常见症状
- 应用程序响应时间变长
- 慢查询日志中出现大量慢查询
- CPU 利用率持续偏高
- 查询执行计划不合理
诊断方法
sql
-- 查看慢查询日志
SHOW GLOBAL VARIABLES LIKE '%slow_query_log%';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 分析执行计划
EXPLAIN SELECT * FROM table WHERE condition;
EXPLAIN ANALYZE SELECT * FROM table WHERE condition;
-- 查看执行计划缓存
SHOW GLOBAL STATUS LIKE 'prepared_plan_cache%';解决方案
1. 优化 SQL 语句
sql
-- 避免全表扫描
SELECT * FROM table WHERE indexed_column = value;
-- 避免 SELECT *
SELECT column1, column2 FROM table WHERE condition;
-- 避免在 WHERE 子句中对索引列进行函数操作
SELECT * FROM table WHERE date_format(create_time, '%Y-%m-%d') = '2023-01-01';
-- 优化为
SELECT * FROM table WHERE create_time BETWEEN '2023-01-01 00:00:00' AND '2023-01-01 23:59:59';2. 添加或优化索引
sql
-- 添加合适的索引
ALTER TABLE table ADD INDEX idx_column (column);
-- 添加联合索引
ALTER TABLE table ADD INDEX idx_column1_column2 (column1, column2);
-- 删除无用索引
ALTER TABLE table DROP INDEX idx_useless;3. 更新统计信息
sql
-- 更新单表统计信息
ANALYZE TABLE table;
-- 更新所有表统计信息
ANALYZE TABLE ALL IN database;
-- 使用指定采样率更新统计信息
ANALYZE TABLE table WITH 20 SAMPLES;事务性能问题
常见症状
- 事务提交时间变长
- 出现大量锁等待
- 事务冲突频繁
- 死锁问题
诊断方法
sql
-- 查看锁等待情况
SELECT * FROM information_schema.cluster_lock_waits;
-- 查看事务状态
SELECT * FROM information_schema.cluster_transactions WHERE state != 'committed' AND state != 'rolled back';
-- 查看死锁日志
SHOW GLOBAL VARIABLES LIKE '%deadlock_detect%';
SET GLOBAL deadlock_detect = 'ON';
-- 查看事务历史
SELECT * FROM information_schema.cluster_transaction_history ORDER BY start_ts DESC LIMIT 100;解决方案
1. 优化事务设计
- 减少事务持有锁的时间
- 避免长事务
- 合理设计事务粒度
sql
-- 优化前:长事务
START TRANSACTION;
-- 大量查询和更新操作
COMMIT;
-- 优化后:拆分为短事务
START TRANSACTION;
-- 部分更新操作
COMMIT;
START TRANSACTION;
-- 另一部分更新操作
COMMIT;2. 避免热点问题
- 合理设计分库分表策略
- 使用批量写入代替单条写入
- 避免集中更新同一行数据
3. 调整事务隔离级别
sql
-- 查看当前隔离级别
SELECT @@global.tidb_txn_isolation, @@tidb_txn_isolation;
-- 设置合适的隔离级别
SET GLOBAL tidb_txn_isolation = 'READ-COMMITTED';
SET SESSION tidb_txn_isolation = 'READ-COMMITTED';集群性能问题
常见症状
- 集群整体吞吐量下降
- 节点间负载不均衡
- Region 分布不合理
- 大量的 Region 迁移
诊断方法
bash
# 查看集群状态
tiup cluster display <cluster-name>
# 查看 PD 调度状态
tiup ctl pd -u http://<pd-address>:2379 store
tiup ctl pd -u http://<pd-address>:2379 region top hot-write
tiup ctl pd -u http://<pd-address>:2379 region top hot-read解决方案
1. 调整 PD 调度参数
bash
# 调整调度速率
tiup ctl pd -u http://<pd-address>:2379 config set schedule.leader-schedule-limit 8
tiup ctl pd -u http://<pd-address>:2379 config set schedule.region-schedule-limit 40
tiup ctl pd -u http://<pd-address>:2379 config set schedule.replica-schedule-limit 128
# 调整热点调度
tiup ctl pd -u http://<pd-address>:2379 config set hot-region-schedule-limit 32
tiup ctl pd -u http://<pd-address>:2379 config set hot-region-cache-hits-threshold 32. 优化 Region 分布
bash
# 手动分裂热点 Region
tiup ctl pd -u http://<pd-address>:2379 operator add split-region <region-id>
# 调整 Region 副本数
tiup ctl pd -u http://<pd-address>:2379 config set replication.max-replicas 33. 调整 TiKV 配置
toml
# 调整 TiKV 线程池大小
[storage]
scheduler-worker-pool-size = 4
# 调整 RocksDB 线程池大小
[rocksdb]
max-background-jobs = 8资源利用率问题
常见症状
- CPU 利用率过高或过低
- 内存使用率持续偏高
- 磁盘 I/O 负载过高
- 网络带宽饱和
诊断方法
bash
# 查看节点资源使用情况
tiup cluster display <cluster-name> --dashboard
# 查看 TiKV 监控
grafana http://<grafana-address>:3000/d/TiKV-Details/tikv-details
# 查看 TiDB 监控
grafana http://<grafana-address>:3000/d/TiDB-Details/tidb-details解决方案
1. 调整资源配置
toml
# 调整 TiDB 最大 CPU 核心数
[performance]
max-procs = 16
# 调整 TiKV 内存配置
[server]
grpc-memory-pool-quota = "4GB"
# 调整 TiDB 内存限制
[performance]
txn-total-size-limit = "1GB"
txn-entry-size-limit = "64MB"2. 优化存储配置
- 使用高性能存储设备(如 SSD)
- 合理配置 RAID 级别
- 调整文件系统参数
3. 优化网络配置
- 使用万兆网络
- 调整 TCP 缓冲区大小
- 优化网络拓扑
性能诊断工具
1. TiDB Dashboard
TiDB Dashboard 是一个集成的监控和诊断平台,可以查看:
- 慢查询分析
- 事务分析
- 热点分析
- 集群状态
- 性能监控
2. EXPLAIN 和 EXPLAIN ANALYZE
用于分析查询执行计划,帮助优化 SQL 语句。
3. Slow Query Log
记录执行时间超过阈值的查询,用于定位慢查询问题。
4. Performance Schema
提供详细的性能数据,用于诊断各种性能问题。
5. TiKV-Ctl 和 PD-Ctl
用于查看和调整 TiKV 和 PD 的状态和配置。
性能优化最佳实践
1. 架构设计
- 根据业务需求选择合适的部署架构
- 合理规划分库分表策略
- 考虑读写分离和热点分散
2. 索引优化
- 为经常查询的列添加索引
- 避免创建过多索引
- 定期检查和优化索引
3. SQL 优化
- 编写高效的 SQL 语句
- 避免全表扫描和复杂的 JOIN
- 使用合适的查询方式
4. 配置调优
- 根据硬件配置调整参数
- 定期评估和优化配置
- 参考官方最佳实践
5. 监控和告警
- 配置完善的监控系统
- 设置合理的告警阈值
- 及时处理告警信息
常见问题(FAQ)
Q1: 如何定位 TiDB 中的慢查询?
A1: 可以通过以下方法定位慢查询:
- 启用慢查询日志
- 使用 TiDB Dashboard 的慢查询分析功能
- 使用 EXPLAIN 和 EXPLAIN ANALYZE 分析执行计划
- 查看 Performance Schema 中的慢查询数据
Q2: 如何优化 TiDB 中的事务性能?
A2: 可以从以下几个方面优化事务性能:
- 减少事务持有锁的时间
- 避免长事务
- 合理设计事务粒度
- 调整事务隔离级别
- 避免热点问题
Q3: 如何解决 TiKV 的高 CPU 利用率问题?
A3: 可以尝试以下解决方案:
- 检查是否有大量慢查询
- 检查是否有热点 Region
- 调整 TiKV 的线程池配置
- 考虑扩容 TiKV 节点
- 优化 RocksDB 配置
Q4: 如何解决 TiDB 的内存不足问题?
A4: 可以尝试以下解决方案:
- 调整 TiDB 的内存限制参数
- 优化查询,减少内存使用
- 增加 TiDB 节点的内存
- 考虑使用 TiFlash 处理分析型查询
Q5: 如何解决 Region 热点问题?
A5: 可以尝试以下解决方案:
- 调整 PD 的热点调度参数
- 手动分裂热点 Region
- 优化应用程序,避免集中更新同一行数据
- 考虑使用分库分表分散热点
- 使用 TiDB 的热点消除功能
Q6: 如何优化 TiDB 的写入性能?
A6: 可以尝试以下解决方案:
- 使用批量写入代替单条写入
- 调整 TiKV 的配置,增加并行度
- 优化事务设计,减少锁冲突
- 考虑扩容 TiKV 节点
- 调整 PD 调度参数,加快 Region 分裂
Q7: 如何优化 TiDB 的读取性能?
A7: 可以尝试以下解决方案:
- 添加合适的索引
- 优化查询语句
- 更新统计信息
- 考虑使用 TiFlash 处理分析型查询
- 调整 TiDB 的缓存配置
Q8: 如何监控 TiDB 的性能?
A8: 可以使用以下监控工具:
- TiDB Dashboard:集成的监控和诊断平台
- Prometheus + Grafana:提供详细的监控指标
- 慢查询日志:记录慢查询信息
- Performance Schema:提供详细的性能数据
Q9: 如何处理 TiDB 中的死锁问题?
A9: 可以尝试以下解决方案:
- 启用死锁检测
- 查看死锁日志,分析死锁原因
- 优化事务设计,避免循环等待
- 调整事务隔离级别
- 使用乐观锁替代悲观锁
Q10: 如何优化 TiDB 的 JOIN 性能?
A10: 可以尝试以下解决方案:
- 为 JOIN 列添加索引
- 优化 JOIN 顺序
- 考虑使用子查询或临时表
- 调整 TiDB 的 JOIN 配置参数
- 对于大数据量 JOIN,考虑使用 TiFlash
Q11: 如何优化 TiDB 的 COUNT(*) 性能?
A11: 可以尝试以下解决方案:
- 对于有主键的表,COUNT(*) 性能较好
- 考虑使用近似计数(如 HyperLogLog)
- 对于频繁查询的 COUNT 结果,可以考虑缓存
- 考虑使用 TiFlash 加速 COUNT 查询
Q12: 如何优化 TiDB 的分页查询性能?
A12: 可以尝试以下解决方案:
- 使用覆盖索引
- 避免使用 OFFSET 进行深度分页
- 使用 ID 范围查询替代 OFFSET
- 考虑使用游标分页
Q13: 如何优化 TiDB 的导入性能?
A13: 可以尝试以下解决方案:
- 使用 TiDB Lightning 进行批量导入
- 调整 TiDB Lightning 配置,增加并行度
- 关闭或调整检查约束
- 考虑使用物理导入模式
Q14: 如何优化 TiDB 的备份和恢复性能?
A14: 可以尝试以下解决方案:
- 使用 TiDB Backup & Restore (BR) 工具
- 调整 BR 的并发度和速率限制
- 考虑使用增量备份
- 备份到高性能存储设备
Q15: 如何评估 TiDB 集群的性能?
A15: 可以从以下几个方面评估:
- 吞吐量:每秒处理的查询数或事务数
- 延迟:查询或事务的响应时间
- 资源利用率:CPU、内存、磁盘 I/O、网络
- 可用性:集群的正常运行时间
- 可扩展性:随着数据量和请求量增加,性能的变化情况
