greatsql教程FG012-GreatSQL性能优化策略实战
内容简介
本教程详细介绍GreatSQL数据库的性能优化策略,包括系统级优化、参数调优、查询优化、索引优化等内容。风哥教程参考GreatSQL官方文档性能优化指南,帮助读者掌握数据库性能优化的最佳实践。
性能优化是数据库管理的重要任务,合理的优化策略可以显著提高数据库性能,减少资源消耗。本教程将从基础概念入手,逐步深入到实战案例和最佳实践。
目录大纲
Part01-基础概念与理论知识
1.1 性能优化概述
性能优化是指通过调整系统和数据库参数,优化查询语句,改善硬件配置等手段,提高数据库系统的性能和响应速度。GreatSQL性能优化的目标是:
- 提高查询响应速度
- 减少资源消耗
- 提高系统吞吐量
- 增强系统稳定性
1.2 性能瓶颈分析
常见的性能瓶颈包括:
- 硬件瓶颈:CPU、内存、磁盘I/O、网络
- 系统瓶颈:操作系统参数、文件系统
- 数据库瓶颈:参数配置、索引设计、查询语句
- 应用瓶颈:应用设计、连接管理
1.3 优化方法论
性能优化的方法论:
- 监控系统性能
- 识别性能瓶颈
- 制定优化方案
- 实施优化措施
- 验证优化效果
- 持续监控和调整
Part02-生产环境规划与建议
2.1 硬件规划
风哥提示:硬件是数据库性能的基础,合理的硬件配置可以为性能优化提供良好的基础。
硬件规划建议:
- CPU:选择多核、高频率的CPU,推荐至少8核以上
- 内存:内存大小应根据数据量和查询模式决定,推荐至少16GB以上
- 存储:使用SSD存储,配置RAID 10提高性能和可靠性
- 网络:使用千兆或万兆网络,减少网络延迟
2.2 系统参数规划
系统参数规划建议:
- 调整内核参数(如文件描述符、网络参数)
- 优化文件系统(如使用ext4或xfs)
- 配置大内存页
- 关闭不必要的服务
2.3 数据库参数规划
数据库参数规划建议:
- 调整缓冲区大小(如innodb_buffer_pool_size)
- 优化日志配置(如innodb_log_file_size)
- 调整连接参数(如max_connections)
- 优化查询缓存(如query_cache_size)
更多视频教程www.fgedu.net.cn
Part03-生产环境项目实施方案
3.1 系统优化方案
系统优化实施方案:
- 调整内核参数
- 优化文件系统
- 配置大内存页
- 关闭透明大页
- 调整网络参数
3.2 参数调优方案
参数调优实施方案:
- 分析系统负载
- 调整缓冲区大小
- 优化日志配置
- 调整连接参数
- 测试参数效果
3.3 查询优化方案
查询优化实施方案:
- 分析慢查询日志
- 优化查询语句
- 创建合适的索引
- 使用查询缓存
- 测试查询性能
Part04-生产案例与实战讲解
4.1 系统优化实战
# 调整内核参数
cat >> /etc/sysctl.conf << EOF
# GreatSQL优化 fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmax = 68719476736 kernel.shmall = 16777216 net.core.netdev_max_backlog = 4096 net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 15 EOF
# 应用内核参数 sysctl -p
cat >> /etc/sysctl.conf << EOF
# GreatSQL优化 fs.file-max = 6815744 kernel.sem = 250 32000 100 128 kernel.shmmax = 68719476736 kernel.shmall = 16777216 net.core.netdev_max_backlog = 4096 net.core.somaxconn = 4096 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_keepalive_intvl = 15 EOF
# 应用内核参数 sysctl -p
# 调整文件描述符
cat >> /etc/security/limits.conf << EOF
# GreatSQL优化 * soft nofile 65536 * hard nofile 65536 greatsql soft nofile 65536 greatsql hard nofile 65536 EOF
cat >> /etc/security/limits.conf << EOF
# GreatSQL优化 * soft nofile 65536 * hard nofile 65536 greatsql soft nofile 65536 greatsql hard nofile 65536 EOF
# 配置大内存页
echo ‘vm.nr_hugepages = 16384’ >> /etc/sysctl.conf sysctl -p
echo ‘vm.nr_hugepages = 16384’ >> /etc/sysctl.conf sysctl -p
学习交流加群风哥微信: itpux-com
4.2 参数调优实战
# 调整GreatSQL参数
cat >> /etc/my.cnf << EOF
# GreatSQL性能优化 [mysqld]
# 缓冲区设置 innodb_buffer_pool_size = 8G innodb_buffer_pool_instances = 8
# 日志设置 innodb_log_file_size = 512M innodb_log_files_in_group = 2 innodb_flush_log_at_trx_commit = 2
# 连接设置 max_connections = 1000 max_connect_errors = 10000
# 查询设置 query_cache_type = 0 query_cache_size = 0
# 其他设置 innodb_file_per_table = 1 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 innodb_stats_on_metadata = 0
# 线程设置 thread_cache_size = 100 innodb_thread_concurrency = 0 EOF
# 重启GreatSQL服务
systemctl restart greatsql
cat >> /etc/my.cnf << EOF
# GreatSQL性能优化 [mysqld]
# 缓冲区设置 innodb_buffer_pool_size = 8G innodb_buffer_pool_instances = 8
# 日志设置 innodb_log_file_size = 512M innodb_log_files_in_group = 2 innodb_flush_log_at_trx_commit = 2
# 连接设置 max_connections = 1000 max_connect_errors = 10000
# 查询设置 query_cache_type = 0 query_cache_size = 0
# 其他设置 innodb_file_per_table = 1 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 innodb_io_capacity_max = 4000 innodb_stats_on_metadata = 0
# 线程设置 thread_cache_size = 100 innodb_thread_concurrency = 0 EOF
# 重启GreatSQL服务
systemctl restart greatsql
# 查看参数设置
mysql -u root -pFGedu123456! -e “SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;” mysql -u root -pFGedu123456! -e “SHOW VARIABLES LIKE ‘max_connections’;”
mysql -u root -pFGedu123456! -e “SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;” mysql -u root -pFGedu123456! -e “SHOW VARIABLES LIKE ‘max_connections’;”
+————————-+————+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 8589934592 |
+————————-+————+
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 1000 |
+—————–+——-+
| Variable_name | Value |
+————————-+————+
| innodb_buffer_pool_size | 8589934592 |
+————————-+————+
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 1000 |
+—————–+——-+
学习交流加群风哥QQ113257174
4.3 查询优化实战
# 启用慢查询日志
mysql -u root -pFGedu123456! -e “SET GLOBAL slow_query_log = ON;” mysql -u root -pFGedu123456! -e “SET GLOBAL slow_query_log_file = ‘/greatsql/logs/slow_query.log’;” mysql -u root -pFGedu123456! -e “SET GLOBAL long_query_time = 1;”
mysql -u root -pFGedu123456! -e “SET GLOBAL slow_query_log = ON;” mysql -u root -pFGedu123456! -e “SET GLOBAL slow_query_log_file = ‘/greatsql/logs/slow_query.log’;” mysql -u root -pFGedu123456! -e “SET GLOBAL long_query_time = 1;”
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
# 分析慢查询
mysql -u root -pFGedu123456! -e “SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2023-01-01’ AND ‘2024-12-31’;”
mysql -u root -pFGedu123456! -e “SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2023-01-01’ AND ‘2024-12-31’;”
+—-+————+————+———-+——–+
| id | sale_date | product_id | quantity | amount |
+—-+————+————+———-+——–+
| 1 | 2023-01-01 | 1 | 10 | 100.00 |
| 2 | 2024-01-01 | 2 | 20 | 200.00 |
+—-+————+————+———-+——–+
| id | sale_date | product_id | quantity | amount |
+—-+————+————+———-+——–+
| 1 | 2023-01-01 | 1 | 10 | 100.00 |
| 2 | 2024-01-01 | 2 | 20 | 200.00 |
+—-+————+————+———-+——–+
# 查看执行计划 EXPLAIN SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2023-01-01’ AND ‘2024-12-31’;
+—-+————-+————-+————+——+——————+——————+———+——-+——+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————-+————+——+——————+——————+———+——-+——+————-+
| 1 | SIMPLE | fgedu_sales | p2023,p2024 | range | idx_sale_date,idx_sale_date_product | idx_sale_date | 3 | NULL | 2 | Using index condition |
+—-+————-+————-+————+——+——————+——————+———+——-+——+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————-+————+——+——————+——————+———+——-+——+————-+
| 1 | SIMPLE | fgedu_sales | p2023,p2024 | range | idx_sale_date,idx_sale_date_product | idx_sale_date | 3 | NULL | 2 | Using index condition |
+—-+————-+————-+————+——+——————+——————+———+——-+——+————-+
# 优化查询 CREATE INDEX idx_sale_date_range ON fgedu_sales(sale_date, product_id, amount);
Query OK, 0 rows affected (0.02 sec)
# 再次查看执行计划 EXPLAIN SELECT * FROM fgedu_sales WHERE sale_date BETWEEN ‘2023-01-01’ AND ‘2024-12-31’;
+—-+————-+————-+————+——+—————————————-+———————+———+——-+——+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————-+————+——+—————————————-+———————+———+——-+——+————-+
| 1 | SIMPLE | fgedu_sales | p2023,p2024 | range | idx_sale_date,idx_sale_date_product,idx_sale_date_range | idx_sale_date_range | 3 | NULL | 2 | Using index |
+—-+————-+————-+————+——+—————————————-+———————+———+——-+——+————-+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+————-+————+——+—————————————-+———————+———+——-+——+————-+
| 1 | SIMPLE | fgedu_sales | p2023,p2024 | range | idx_sale_date,idx_sale_date_product,idx_sale_date_range | idx_sale_date_range | 3 | NULL | 2 | Using index |
+—-+————-+————-+————+——+—————————————-+———————+———+——-+——+————-+
Part05-风哥经验总结与分享
5.1 常见性能问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 查询速度慢 | 优化查询语句,创建合适的索引 |
| 连接数过多 | 调整max_connections参数,使用连接池 |
| 内存使用高 | 调整缓冲区大小,优化内存使用 |
| 磁盘I/O高 | 使用SSD,优化存储配置 |
5.2 性能优化最佳实践
- 定期监控系统性能
- 分析慢查询日志
- 优化查询语句和索引
- 合理配置系统和数据库参数
- 使用连接池管理连接
- 定期维护数据库(如优化表、重建索引)
- 使用缓存减少数据库负载
更多学习教程公众号风哥教程itpux_com
5.3 监控与调优建议
# 监控系统性能 vmstat 1 5
procs ———–memory———- —swap– —–io—- -system– ——cpu—–
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 11 21 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 11 21 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 11 21 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 11 21 1 1 98 0 0
0 0 0 1638400 16384 262144 0 0 0 0 10 20 1 1 98 0 0
# 监控GreatSQL性能
mysql -u root -pFGedu123456! -e “SHOW GLOBAL STATUS LIKE ‘Threads%’;” mysql -u root -pFGedu123456! -e “SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool%’;”
mysql -u root -pFGedu123456! -e “SHOW GLOBAL STATUS LIKE ‘Threads%’;” mysql -u root -pFGedu123456! -e “SHOW GLOBAL STATUS LIKE ‘Innodb_buffer_pool%’;”
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| Threads_cached | 10 |
| Threads_connected | 5 |
| Threads_created | 15 |
| Threads_running | 1 |
+————————-+——-+
+————————————-+————-+
| Variable_name | Value |
+————————————-+————-+
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 1000 |
| Innodb_buffer_pool_reads | 100 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 500 |
+————————————-+————-+
| Variable_name | Value |
+————————-+——-+
| Threads_cached | 10 |
| Threads_connected | 5 |
| Threads_created | 15 |
| Threads_running | 1 |
+————————-+——-+
+————————————-+————-+
| Variable_name | Value |
+————————————-+————-+
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 1000 |
| Innodb_buffer_pool_reads | 100 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 500 |
+————————————-+————-+
性能优化脚本
# 创建性能优化脚本
cat > /greatsql/scripts/performance_tune.sh << 'EOF'
#!/bin/bash # performance_tune.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 连接数据库
mysql -u root -pFGedu123456! << 'SQL'
# 优化表 OPTIMIZE TABLE fgedu_sales, fgedu_users, fgedu_orders, fgedu_products;
# 分析表 ANALYZE TABLE fgedu_sales, fgedu_users, fgedu_orders, fgedu_products;
# 查看慢查询 SELECT * FROM performance_schema.events_statements_history_long WHERE timer_wait > 1000000000 LIMIT 10; SQL
echo “Performance tuning completed!” EOF
# 设置脚本权限
chmod +x /greatsql/scripts/performance_tune.sh
cat > /greatsql/scripts/performance_tune.sh << 'EOF'
#!/bin/bash # performance_tune.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
# 连接数据库
mysql -u root -pFGedu123456! << 'SQL'
# 优化表 OPTIMIZE TABLE fgedu_sales, fgedu_users, fgedu_orders, fgedu_products;
# 分析表 ANALYZE TABLE fgedu_sales, fgedu_users, fgedu_orders, fgedu_products;
# 查看慢查询 SELECT * FROM performance_schema.events_statements_history_long WHERE timer_wait > 1000000000 LIMIT 10; SQL
echo “Performance tuning completed!” EOF
# 设置脚本权限
chmod +x /greatsql/scripts/performance_tune.sh
# 执行性能优化脚本 /greatsql/scripts/performance_tune.sh
+——————+———-+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————+———-+———-+———-+
| fgedudb.fgedu_sales | optimize | status | OK |
| fgedudb.fgedu_users | optimize | status | OK |
| fgedudb.fgedu_orders | optimize | status | OK |
| fgedudb.fgedu_products | optimize | status | OK |
+——————+———-+———-+———-+
+——————+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————+———+———-+———-+
| fgedudb.fgedu_sales | analyze | status | OK |
| fgedudb.fgedu_users | analyze | status | OK |
| fgedudb.fgedu_orders | analyze | status | OK |
| fgedudb.fgedu_products | analyze | status | OK |
+——————+———+———-+———-+
Performance tuning completed!
| Table | Op | Msg_type | Msg_text |
+——————+———-+———-+———-+
| fgedudb.fgedu_sales | optimize | status | OK |
| fgedudb.fgedu_users | optimize | status | OK |
| fgedudb.fgedu_orders | optimize | status | OK |
| fgedudb.fgedu_products | optimize | status | OK |
+——————+———-+———-+———-+
+——————+———+———-+———-+
| Table | Op | Msg_type | Msg_text |
+——————+———+———-+———-+
| fgedudb.fgedu_sales | analyze | status | OK |
| fgedudb.fgedu_users | analyze | status | OK |
| fgedudb.fgedu_orders | analyze | status | OK |
| fgedudb.fgedu_products | analyze | status | OK |
+——————+———+———-+———-+
Performance tuning completed!
性能监控脚本
# 创建性能监控脚本
cat > /greatsql/scripts/performance_monitor.sh << 'EOF'
#!/bin/bash # performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== GreatSQL Performance Monitor ===” echo “Date: $(date)” echo “”
# 连接数据库
mysql -u root -pFGedu123456! << 'SQL'
# 查看连接数 SELECT COUNT(*) as connections FROM information_schema.processlist;
# 查看慢查询 SELECT COUNT(*) as slow_queries FROM performance_schema.events_statements_history_long WHERE timer_wait > 1000000000;
# 查看缓冲池使用情况 SELECT ROUND((buffer_pool_size / 1024 / 1024), 2) as buffer_pool_size_mb, ROUND((buffer_pool_used / 1024 / 1024), 2) as buffer_pool_used_mb, ROUND((buffer_pool_used / buffer_pool_size) * 100, 2) as buffer_pool_usage_percent FROM ( SELECT @@innodb_buffer_pool_size as buffer_pool_size, SUM(data_length + index_length) as buffer_pool_used FROM information_schema.tables WHERE engine = ‘InnoDB’ ) as t; SQL
echo “” echo “=== System Performance ===”
# 查看系统负载 uptime
# 查看内存使用 free -h
# 查看磁盘I/O iostat -x 1 3 EOF
# 设置脚本权限
chmod +x /greatsql/scripts/performance_monitor.sh
cat > /greatsql/scripts/performance_monitor.sh << 'EOF'
#!/bin/bash # performance_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== GreatSQL Performance Monitor ===” echo “Date: $(date)” echo “”
# 连接数据库
mysql -u root -pFGedu123456! << 'SQL'
# 查看连接数 SELECT COUNT(*) as connections FROM information_schema.processlist;
# 查看慢查询 SELECT COUNT(*) as slow_queries FROM performance_schema.events_statements_history_long WHERE timer_wait > 1000000000;
# 查看缓冲池使用情况 SELECT ROUND((buffer_pool_size / 1024 / 1024), 2) as buffer_pool_size_mb, ROUND((buffer_pool_used / 1024 / 1024), 2) as buffer_pool_used_mb, ROUND((buffer_pool_used / buffer_pool_size) * 100, 2) as buffer_pool_usage_percent FROM ( SELECT @@innodb_buffer_pool_size as buffer_pool_size, SUM(data_length + index_length) as buffer_pool_used FROM information_schema.tables WHERE engine = ‘InnoDB’ ) as t; SQL
echo “” echo “=== System Performance ===”
# 查看系统负载 uptime
# 查看内存使用 free -h
# 查看磁盘I/O iostat -x 1 3 EOF
# 设置脚本权限
chmod +x /greatsql/scripts/performance_monitor.sh
# 执行性能监控脚本 /greatsql/scripts/performance_monitor.sh
=== GreatSQL Performance Monitor ===
Date: Wed Apr 9 20:00:00 CST 2026
+————-+
| connections |
+————-+
| 5 |
+————-+
+————-+
| slow_queries |
+————-+
| 0 |
+————-+
+———————-+———————+————————-+
| buffer_pool_size_mb | buffer_pool_used_mb | buffer_pool_usage_percent |
+———————-+———————+————————-+
| 8192.00 | 100.00 | 1.22 |
+———————-+———————+————————-+
=== System Performance ===
20:00:00 up 10 days, 2:00, 1 user, load average: 0.10, 0.05, 0.01
total used free shared buff/cache available
Mem: 16G 2.0G 12G 100M 2.0G 14G
Swap: 4G 0B 4G
Linux 5.14.0-362.el9.x86_64 (fgedu.net.cn) 04/09/2026 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.00 0.00 1.00 0.00 0.00 98.00
device r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Date: Wed Apr 9 20:00:00 CST 2026
+————-+
| connections |
+————-+
| 5 |
+————-+
+————-+
| slow_queries |
+————-+
| 0 |
+————-+
+———————-+———————+————————-+
| buffer_pool_size_mb | buffer_pool_used_mb | buffer_pool_usage_percent |
+———————-+———————+————————-+
| 8192.00 | 100.00 | 1.22 |
+———————-+———————+————————-+
=== System Performance ===
20:00:00 up 10 days, 2:00, 1 user, load average: 0.10, 0.05, 0.01
total used free shared buff/cache available
Mem: 16G 2.0G 12G 100M 2.0G 14G
Swap: 4G 0B 4G
Linux 5.14.0-362.el9.x86_64 (fgedu.net.cn) 04/09/2026 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
1.00 0.00 1.00 0.00 0.00 98.00
device r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
nvme0n1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
from greatsql视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
