fgedu.net.cn
目录
一、基础概念
1.1 性能调优定义
性能调优是指通过分析系统性能瓶颈,采取相应的措施提高系统性能的过程。TiDB的性能调优涉及多个层面,包括硬件配置、系统参数、SQL语句、索引设计等。
1.2 性能瓶颈
- CPU瓶颈:CPU使用率过高
- 内存瓶颈:内存不足或内存泄漏
- 磁盘瓶颈:磁盘I/O性能不足
- 网络瓶颈:网络带宽不足或延迟过高
- SQL瓶颈:SQL语句执行效率低
- 索引瓶颈:索引设计不合理
1.3 诊断工具
- TiDB Dashboard:可视化监控和诊断工具
- Prometheus:监控指标收集和存储
- Grafana:监控数据可视化
- EXPLAIN:SQL执行计划分析
- Slow Query Log:慢查询日志分析
- TiDB System Tables:系统表查询
二、规划建议
2.1 性能调优策略
- 硬件优化:选择合适的硬件配置
- 系统参数优化:调整TiDB、TiKV、PD的配置参数
- SQL优化:优化SQL语句和执行计划
- 索引优化:设计合理的索引
- 架构优化:合理设计数据库架构
- 监控与诊断:建立完善的监控和诊断体系
2.2 性能目标
- 响应时间:SQL语句执行时间
- 吞吐量:单位时间内处理的请求数
- 并发数:同时处理的请求数
- 资源利用率:CPU、内存、磁盘、网络的使用情况
2.3 调优步骤
- 监控:收集性能指标
- 分析:识别性能瓶颈
- 优化:采取相应的优化措施
- 验证:验证优化效果
- 持续监控:确保性能稳定
三、实施方案
3.1 系统参数优化
TiDB参数优化
# tidb.toml配置示例
[server]
port = 4000
status_port = 10080
host = "0.0.0.0"
[performance]
max-procs = 8
stmt-count-limit = 10000
txn-total-size-limit = 1073741824
[prepared-plan-cache]
enable = true
capacity = 1000
[txn]
enable-async-commit = true
enable-1pc = true
enable-pessimistic-txn = true
风哥提示:
TiKV参数优化
# tikv.toml配置示例
[server]
grpc-concurrency = 8
[storage]
enable-prefetch = true
[rocksdb]
max-background-jobs = 4
max-open-files = 4096
[raftdb]
max-background-jobs = 4
[readpool]
unified-max-thread-count = 8
[writepool]
normal-max-thread-count = 8
PD参数优化
# pd.toml配置示例
[server]
leader-priority = 5
[scheduler]
enable-cross-table-merge = true
enable-location-replacement = true
[replication]
max-replicas = 3
location-labels = ["zone", "rack", "host"]
3.2 SQL优化
使用EXPLAIN分析执行计划
EXPLAIN SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
+-------------------------+----------+-----------+------------------------+---------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+------------------------+---------------------------------------+ | Sort_6 | 10000.00 | root | | sort by:created_at DESC | | └─TableReader_5 | 10000.00 | root | | data:Selection_4 | | └─Selection_4 | 10000.00 | cop[tikv] | | where:age > 30 | | └─TableScan_3 | 100000.00| cop[tikv] | table:fgedu_users | range:[-inf,+inf], keep order:false | +-------------------------+----------+-----------+------------------------+---------------------------------------+
优化SQL语句
-- 优化前:全表扫描
SELECT * FROM fgedudb.fgedu_users WHERE age > 30;
-- 优化后:使用索引
CREATE INDEX idx_age ON fgedudb.fgedu_users (age);
SELECT * FROM fgedudb.fgedu_users WHERE age > 30;
-- 优化前:使用SELECT *
SELECT * FROM fgedudb.fgedu_users WHERE id = 1;
-- 优化后:只查询需要的列
SELECT id, username, email FROM fgedudb.fgedu_users WHERE id = 1;
-- 优化前:未使用索引排序
SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
-- 优化后:使用复合索引
CREATE INDEX idx_age_created_at ON fgedudb.fgedu_users (age, created_at);
SELECT * FROM fgedudb.fgedu_users WHERE age > 30 ORDER BY created_at;
3.3 监控与诊断
使用TiDB Dashboard
# 访问TiDB Dashboard
# 地址:http://pd-host:2379/dashboard
# 查看SQL语句分析
# Dashboard > SQL语句分析
# 查看慢查询
# Dashboard > 慢查询
# 查看集群状态
# Dashboard > 集群信息
使用Prometheus和Grafana
# 访问Grafana
# 地址:http://grafana-host:3000
# 查看TiDB面板
# 面板 > TiDB Overview
学习交流加群风哥QQ113257174
# 查看TiKV面板
# 面板 > TiKV Overview
# 查看PD面板
# 面板 > PD Overview
分析慢查询日志
# 启用慢查询日志
# 修改tidb.toml
[log]
slow-query-file = "/tidb/log/tidb-slow.log"
slow-threshold = 300
# 查看慢查询日志
cat /tidb/log/tidb-slow.log
# 使用pt-query-digest分析慢查询
pt-query-digest /tidb/log/tidb-slow.log
四、实战案例
4.1 高并发场景性能优化
场景:电商平台高峰期,需要优化TiDB集群性能,应对高并发请求。
步骤1:分析性能瓶颈
# 查看TiDB Dashboard
# 发现CPU使用率高,慢查询增多
# 查看慢查询日志
cat /tidb/log/tidb-slow.log | grep "SELECT" | head -10
# Time: 2024-04-09T10:00:00.000000Z # User@Host: app[app] @ 192.168.1.100 [192.168.1.100] # Query_time: 0.500000 Lock_time: 0.000000 Rows_sent: 10 Rows_examined: 10000 SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10; # Time: 2024-04-09T10:00:01.000000Z # User@Host: app[app] @ 192.168.1.101 [192.168.1.101] # Query_time: 0.450000 Lock_time: 0.000000 Rows_sent: 10 Rows_examined: 8000 SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1002 ORDER BY created_at DESC LIMIT 10;
步骤2:优化索引
# 分析执行计划
EXPLAIN SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
+-------------------------+----------+-----------+------------------------+---------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+------------------------+---------------------------------------+ | Limit_7 | 10.00 | root | | limit offset:0, count:10 | | └─Sort_6 | 10.00 | root | | sort by:created_at DESC | | └─TableReader_5 | 100.00 | root | | data:Selection_4 | | └─Selection_4 | 100.00 | cop[tikv] | | where:user_id = 1001 | | └─TableScan_3 | 1000.00 | cop[tikv] | table:fgedu_orders | range:[-inf,+inf], keep order:false | +-------------------------+----------+-----------+------------------------+---------------------------------------+
# 创建复合索引
CREATE INDEX idx_user_id_created_at ON fgedudb.fgedu_orders (user_id, created_at DESC);
步骤3:优化SQL语句
-- 优化前:使用SELECT *
SELECT * FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
-- 优化后:只查询需要的列
SELECT id, order_no, total_amount, status, created_at FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
步骤4:优化系统参数
# 修改tidb.toml
[performance]
max-procs = 16 # 增加CPU核心数
prepared-plan-cache-capacity = 5000 # 增加预编译计划缓存
[txn]
enable-async-commit = true
enable-1pc = true
# 修改tikv.toml
[readpool]
unified-max-thread-count = 16 # 增加读线程数
[writepool]
normal-max-thread-count = 16 # 增加写线程数
步骤5:验证优化效果
# 查看执行计划
EXPLAIN SELECT id, order_no, total_amount, status, created_at FROM fgedudb.fgedu_orders WHERE user_id = 1001 ORDER BY created_at DESC LIMIT 10;
+-------------------------+----------+-----------+------------------------+---------------------------------------+ | id | estRows | task | access object | operator info | +-------------------------+----------+-----------+------------------------+---------------------------------------+ | Limit_5 | 10.00 | root | | limit offset:0, count:10 | | └─IndexReader_4 | 10.00 | root | | index:Limit_3 | | └─Limit_3 | 10.00 | cop[tikv] | | limit offset:0, count:10 | | └─IndexScan_2 | 100.00 | cop[tikv] | table:fgedu_orders, index:idx_user_id_created_at(user_id, created_at) | range:[1001,1001], keep order:true | +-------------------------+----------+-----------+------------------------+---------------------------------------+
4.2 大数据量查询优化
场景:数据仓库场景,需要优化大数据量查询的性能。
步骤1:分析性能问题
# 查看慢查询
SELECT * FROM fgedudb.fgedu_sales WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY product_id ORDER BY total_sales DESC LIMIT 10;
-- 执行时间:10秒
步骤2:优化索引
# 创建索引
CREATE INDEX idx_sale_date ON fgedudb.fgedu_sales (sale_date);
步骤3:使用分区表
# 创建分区表
CREATE TABLE fgedudb.fgedu_sales_partitioned (
id BIGINT PRIMARY KEY,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
sale_date DATE NOT NULL,
total_sales DECIMAL(12,2) NOT NULL
) PARTITION BY RANGE (TO_DAYS(sale_date)) (
PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),
PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),
PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')),
PARTITION p202404 VALUES LESS THAN (TO_DAYS('2024-05-01')),
PARTITION p202405 VALUES LESS THAN (TO_DAYS('2024-06-01')),
PARTITION p202406 VALUES LESS THAN (TO_DAYS('2024-07-01'))
);
# 导入数据
INSERT INTO fgedudb.fgedu_sales_partitioned SELECT * FROM fgedudb.fgedu_sales;
步骤4:优化查询
-- 优化查询
SELECT product_id, SUM(total_sales) AS total_sales FROM fgedudb.fgedu_sales_partitioned WHERE sale_date BETWEEN '2024-01-01' AND '2024-01-31' GROUP BY product_id ORDER BY total_sales DESC LIMIT 10;
-- 执行时间:2秒
五、经验总结
5.1 性能调优最佳实践
- 硬件选择:根据业务需求选择合适的硬件配置
- 系统参数优化:根据硬件配置和业务负载调整系统参数
- 索引优化:根据查询模式设计合理的索引
- SQL优化:编写高效的SQL语句,避免全表扫描
- 分区表:对于大表使用分区表,提高查询性能
- 连接池:使用连接池管理数据库连接
- 缓存:对于频繁查询的数据使用缓存
- 监控与诊断:建立完善的监控系统,及时发现性能问题
5.2 性能诊断技巧
- 使用TiDB Dashboard:可视化分析集群性能
- 分析执行计划:使用EXPLAIN分析SQL执行计划
- 查看慢查询日志:识别慢查询并优化
- 监控系统指标:通过Prometheus和Grafana监控系统指标
- 使用系统表:查询系统表获取性能信息
- 压力测试:使用sysbench等工具进行压力测试
5.3 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| SQL执行慢 | 未使用索引、全表扫描、复杂查询 | 创建合适的索引,优化SQL语句 |
| 连接数过高 | 应用程序未使用连接池 | 使用连接池管理连接 |
| 内存使用率高 | 内存配置不足、内存泄漏 | 调整内存配置,检查应用程序 |
| 磁盘I/O高 | 大量写入操作、磁盘性能不足 | 优化写入操作,使用高性能磁盘 |
| CPU使用率高 | SQL执行效率低、并发数过高 | 优化SQL语句,增加CPU资源 |
5.4 性能调优检查清单
| 检查项 | 配置要求 | 状态 |
|---|---|---|
| 硬件配置 | CPU、内存、磁盘、网络配置合理 | □ |
| 系统参数 | TiDB、TiKV、PD参数优化 | □ |
| 索引设计 | 根据查询模式创建合适的索引 | □ |
| SQL语句 | SQL语句优化,避免全表扫描 | □ |
| 分区表 | 对于大表使用分区表 | □ |
| 监控系统 | 部署完善的监控系统 | □ |
| 连接池 | 使用连接池管理数据库连接 | □ |
| 缓存 | 对于频繁查询的数据使用缓存 | □ |
更多视频教程www.fgedu.net.cn
© 2024 TiDB数据库培训文档
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
