OceanBase教程FG125-OceanBase性能优化最佳实践
本文档风哥主要介绍OceanBase性能优化最佳实践,包括性能优化的概念与意义、性能指标、性能优化方法、硬件规划、软件规划、配置规划、系统优化、数据库优化、查询优化、实战案例等内容,风哥教程参考OceanBase官方文档性能优化、系统调优等内容编写,适合DBA人员和运维工程师在学习和工作中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 性能优化的概念与意义
性能优化是指通过调整系统配置、优化数据库结构、改进查询语句等手段,提高系统性能和响应速度的过程。性能优化的意义包括:
- 提高用户体验:系统响应速度快,用户体验好
- 降低硬件成本:通过优化,减少硬件资源的使用
- 提高系统可靠性:减少系统负载,降低故障风险
- 支持业务增长:系统性能提升,支持更多的并发用户和数据量
- 延长系统寿命:减少硬件损耗,延长系统使用寿命
1.2 性能指标
常用的性能指标包括:
- 响应时间:系统处理请求的时间,包括网络延迟、处理时间等
- 吞吐量:系统单位时间内处理的请求数
- 并发数:系统同时处理的请求数
- CPU使用率:CPU的使用情况
- 内存使用率:内存的使用情况
- 磁盘I/O:磁盘的读写速度
- 网络吞吐量:网络的传输速度
- 查询执行时间:SQL查询的执行时间
1.3 性能优化方法
性能优化的方法包括:
- 硬件优化:升级硬件,如CPU、内存、磁盘等
- 系统优化:调整操作系统参数,如内核参数、文件系统等
- 数据库优化:调整数据库参数,如缓存大小、连接数等
- 查询优化:优化SQL语句,如添加索引、重写查询等
- 架构优化:优化系统架构,如分库分表、读写分离等
- 应用优化:优化应用代码,如减少数据库访问、使用缓存等
Part02-生产环境规划与建议
2.1 硬件规划
硬件规划的考虑因素:
- CPU:选择高性能的CPU,核心数越多越好
- 内存:选择足够的内存,建议至少16GB,生产环境建议32GB以上
- 磁盘:选择高速磁盘,如SSD,建议使用RAID 10
- 网络:选择高速网络,如万兆网卡
- 存储:选择合适的存储方案,如SAN、NAS等
推荐的硬件配置:
- CPU:Intel Xeon E5-2680 v4或更高
- 内存:64GB或以上
- 磁盘:SSD,至少1TB
- 网络:万兆网卡
- 存储:SAN或本地SSD
2.2 软件规划
,风哥提示:。
软件规划的考虑因素:
- 操作系统:选择稳定的操作系统,如Red Hat Enterprise Linux、Oracle Linux等
- 数据库版本:选择稳定的OceanBase版本
- 中间件:选择合适的中间件,如连接池、缓存等
- 监控工具:选择合适的监控工具,如Prometheus、Grafana等
推荐的软件配置:
- 操作系统:Red Hat Enterprise Linux 7.9或8.5
- OceanBase版本:OceanBase 4.0或更高
- 中间件:Druid连接池、Redis缓存
- 监控工具:Prometheus + Grafana
2.3 配置规划
配置规划的考虑因素:
- 系统参数:调整操作系统内核参数,如文件描述符、网络参数等
- 数据库参数:调整OceanBase参数,如内存分配、连接数等
- 存储配置:调整存储参数,如RAID级别、文件系统等
- 网络配置:调整网络参数,如TCP参数、带宽等
推荐的配置:
- 系统参数:
- 文件描述符:65536以上
- 网络参数:调整TCP缓冲区大小
- 内存参数:调整大页内存
,学习交流加群风哥微信: itpux-com。
- 数据库参数:
- 内存分配:根据服务器内存大小调整
- 连接数:根据并发用户数调整
- 缓存大小:根据数据量调整
- 存储配置:
- RAID级别:RAID 10
- 文件系统:ext4或xfs
- 磁盘调度:deadline
- 网络配置:
- TCP参数:调整TCP窗口大小
- 带宽:至少1Gbps
- 网络延迟:尽可能低
Part03-生产环境项目实施方案
3.1 系统优化
3.1.1 系统优化实施步骤
## 1. 操作系统参数优化
– 调整文件描述符:
$ cat > /etc/security/limits.conf << 'EOF'
* soft nofile 65536
* hard nofile 65536,学习交流加群风哥QQ113257174。
root soft nofile 65536
root hard nofile 65536
EOF
- 调整内核参数:
$ cat > /etc/sysctl.conf << 'EOF'
# 网络参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
# 内存参数
vm.swappiness = 10
vm.overcommit_memory = 0
vm.max_map_count = 655360
# 文件系统参数
fs.file-max = 655360
fs.aio-max-nr = 1048576
EOF
- 应用内核参数:
$ sysctl -p
## 2. 磁盘优化
- 检查磁盘I/O性能:
$ iostat -x 1
- 调整磁盘调度算法:
$ echo deadline > /sys/block/sda/queue/scheduler
– 启用磁盘读写缓存:
$ hdparm -W1 /dev/sda,更多视频教程www.fgedu.net.cn。
– 检查RAID状态:
$ mdadm –detail /dev/md0
## 3. 网络优化
– 检查网络带宽:
$ ethtool eth0
– 调整网络参数:
$ ifconfig eth0 txqueuelen 10000
– 启用TCP快速打开:
$ echo 3 > /proc/sys/net/ipv4/tcp_fastopen
– 检查网络连接状态:
$ netstat -an | grep ESTABLISHED | wc -l
## 4. 内存优化
– 检查内存使用情况:
$ free -h
– 调整大页内存:
$ echo 1024 > /proc/sys/vm/nr_hugepages
– 检查内存使用详情:
$ top
## 5. 测试验证
– 测试系统性能:
$ sysbench cpu –cpu-max-prime=20000 run
$ sysbench memory –memory-total-size=1G run
$ sysbench fileio –file-total-size=1G –file-test-mode=rndrw run
– 验证优化效果:
$ iostat -x 1
$ vmstat 1
$ netstat -an | grep ESTABLISHED | wc -l
3.2 数据库优化
,更多学习教程公众号风哥教程itpux_com。
3.2.1 数据库优化实施步骤
## 1. 内存参数优化
– 登录OceanBase:
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p
– 调整内存参数:
> ALTER SYSTEM SET memory_limit_percentage = 80 TENANT ‘sys’;
> ALTER SYSTEM SET memory_limit_percentage = 80 TENANT ‘fgedudb’;
> ALTER SYSTEM SET large_query_ memory_limit = 1073741824 TENANT ‘fgedudb’;
## 2. 连接参数优化
– 调整连接数:
> ALTER SYSTEM SET max_connections = 1000 TENANT ‘fgedudb’;
> ALTER SYSTEM SET connection_idle_timeout = 3600 TENANT ‘fgedudb’;
## 3. 缓存参数优化
– 调整缓存大小:
> ALTER SYSTEM SET block_cache_size = 1073741824 TENANT ‘fgedudb’;
> ALTER SYSTEM SET plan_cache_size = 134217728 TENANT ‘fgedudb’;
## 4. 日志参数优化
– 调整日志参数:
> ALTER SYSTEM SET redo_buffer_size = 134217728 TENANT ‘fgedudb’;
> ALTER SYSTEM SET enable_async_commit = TRUE TENANT ‘fgedudb’;
## 5. 执行计划优化,from DB视频:www.itpux.com。
– 调整执行计划参数:
> ALTER SYSTEM SET enable_plan_cache = TRUE TENANT ‘fgedudb’;
> ALTER SYSTEM SET plan_cache_evict_interval = 3600 TENANT ‘fgedudb’;
## 6. 统计信息优化
– 收集统计信息:
> ANALYZE TABLE fgedu_order;
> ANALYZE TABLE fgedu_user;
## 7. 测试验证
– 测试数据库性能:
$ sysbench oltp_read_write –table-size=1000000 –mysql-host=192.168.1.10 –mysql-port=2881 –mysql-user=root@fgedudb –mysql-password=password –mysql-db=fgedudb –threads=16 –time=60 run
– 验证优化效果:
> SHOW GLOBAL STATUS LIKE ‘Queries’;
> SHOW GLOBAL STATUS LIKE ‘Slow_queries’;
> SHOW GLOBAL STATUS LIKE ‘Innodb_row_reads’;
3.3 查询优化
3.3.1 查询优化实施步骤
## 1. 索引优化
– 查看表结构:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “DESCRIBE fgedu_order;”
– 查看索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW INDEX FROM fgedu_order;”
– 创建索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_id ON fgedu_order(user_id);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_order_time ON fgedu_order(order_time);”
– 优化索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “ALTER TABLE fgedu_order ADD INDEX idx_user_id_order_time(user_id, order_time);”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “DROP INDEX idx_user_id ON fgedu_order;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “DROP INDEX idx_order_time ON fgedu_order;”
## 2. SQL语句优化
– 优化SELECT语句:
– 避免SELECT *:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456;”
– 使用LIMIT:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456 LIMIT 10;”
– 避免在WHERE子句中使用函数:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount FROM fgedu_order WHERE order_time >= ‘2026-01-01’;”
– 使用JOIN代替子查询:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT o.order_id, o.user_id, o.order_amount, u.user_name FROM fgedu_order o JOIN fgedu_user u ON o.user_id = u.user_id WHERE o.user_id = 123456;”
– 优化INSERT语句:
– 使用批量插入:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “INSERT INTO fgedu_order (user_id, order_amount, order_time) VALUES (123456, 100.00, NOW()), (123457, 200.00, NOW()), (123458, 300.00, NOW());”
– 关闭自动提交:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SET autocommit = 0; INSERT INTO fgedu_order (user_id, order_amount, order_time) VALUES (123456, 100.00, NOW()); COMMIT;”
– 优化UPDATE语句:
– 使用索引列:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “UPDATE fgedu_order SET order_status = 1 WHERE order_id = 100001;”
– 避免全表更新:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “UPDATE fgedu_order SET order_status = 1 WHERE user_id = 123456 AND order_time < '2026-01-01';"
- 优化DELETE语句:
- 使用索引列:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "DELETE FROM fgedu_order WHERE order_id = 100001;"
- 分批删除:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "DELETE FROM fgedu_order WHERE order_time < '2025-01-01' LIMIT 1000;"
## 3. 执行计划分析
- 查看执行计划:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "EXPLAIN SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456;"
- 分析执行计划:
- 查看是否使用索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "EXPLAIN SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456;"
- 查看扫描行数:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "EXPLAIN SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456;"
## 4. 测试验证
- 测试查询性能:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "SET profiling = 1; SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456; SHOW PROFILE;"
- 验证优化效果:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "EXPLAIN SELECT order_id, user_id, order_amount FROM fgedu_order WHERE user_id = 123456;"
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e "SELECT COUNT(*) FROM fgedu_order WHERE user_id = 123456;"
Part04-生产案例与实战讲解
4.1 系统优化实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 业务类型:电商业务
– 问题:系统响应缓慢,CPU使用率高
## 实施步骤
### 1. 问题分析
– 检查系统负载:
$ top
– 检查CPU使用率:
$ mpstat 1
– 检查内存使用情况:
$ free -h
– 检查磁盘I/O:
$ iostat -x 1
– 检查网络流量:
$ sar -n DEV 1
### 2. 系统优化
– 调整内核参数:
$ cat > /etc/sysctl.conf << 'EOF'
# 网络参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
# 内存参数
vm.swappiness = 10
vm.overcommit_memory = 0
vm.max_map_count = 655360
# 文件系统参数
fs.file-max = 655360
fs.aio-max-nr = 1048576
EOF
- 应用内核参数:
$ sysctl -p
- 调整文件描述符:
$ cat > /etc/security/limits.conf << 'EOF'
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
EOF
- 调整磁盘调度算法:
$ echo deadline > /sys/block/sda/queue/scheduler
– 启用大页内存:
$ echo 1024 > /proc/sys/vm/nr_hugepages
### 3. 验证效果
– 测试系统性能:
$ sysbench cpu –cpu-max-prime=20000 run
$ sysbench memory –memory-total-size=1G run
$ sysbench fileio –file-total-size=1G –file-test-mode=rndrw run
– 检查系统负载:
$ top
– 检查CPU使用率:
$ mpstat 1
– 检查内存使用情况:
$ free -h
– 检查磁盘I/O:
$ iostat -x 1
– 检查网络流量:
$ sar -n DEV 1
## 案例总结
– 成功优化了系统性能,降低了CPU使用率
– 系统响应速度明显提升
– 验证了系统优化在提高性能中的重要作用
– 建立了系统优化的流程和方法
4.2 数据库优化实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 业务类型:金融核心业务
– 问题:数据库响应缓慢,查询执行时间长
## 实施步骤
### 1. 问题分析
– 查看慢查询日志:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW GLOBAL VARIABLES LIKE ‘slow_query_log’;”
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW GLOBAL VARIABLES LIKE ‘slow_query_log_file’;”
$ cat /ob/logs/oceanbase/slow_query.log
– 分析执行计划:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu_transaction WHERE user_id = 123456;”
– 检查索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW INDEX FROM fgedu_transaction;”
### 2. 数据库优化
– 调整内存参数:
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET memory_limit_percentage = 80 TENANT ‘fgedudb’;”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET large_query_memory_limit = 1073741824 TENANT ‘fgedudb’;”
– 调整缓存参数:
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET block_cache_size = 1073741824 TENANT ‘fgedudb’;”
$ obclient -h192.168.1.10 -P2881 -uroot@sys -p -e “ALTER SYSTEM SET plan_cache_size = 134217728 TENANT ‘fgedudb’;”
– 创建索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_id ON fgedu_transaction(user_id);”
– 收集统计信息:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “ANALYZE TABLE fgedu_transaction;”
### 3. 验证效果
– 测试查询性能:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SET profiling = 1; SELECT * FROM fgedu_transaction WHERE user_id = 123456; SHOW PROFILE;”
– 分析执行计划:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu_transaction WHERE user_id = 123456;”
– 检查慢查询日志:
$ cat /ob/logs/oceanbase/slow_query.log
## 案例总结
– 成功优化了数据库性能,减少了查询执行时间
– 数据库响应速度明显提升
– 验证了数据库优化在提高性能中的重要作用
– 建立了数据库优化的流程和方法
4.3 查询优化实战案例
## 案例背景
– 生产环境:3节点OceanBase集群
– 业务类型:电商业务
– 问题:SQL查询执行时间长,影响系统响应速度
## 实施步骤
### 1. 问题分析
– 查看慢查询:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW GLOBAL STATUS LIKE ‘Slow_queries’;”
– 分析慢查询日志:
$ cat /ob/logs/oceanbase/slow_query.log
– 分析执行计划:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT * FROM fgedu_order WHERE user_id = 123456 AND order_time >= ‘2026-01-01’;”
– 检查索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SHOW INDEX FROM fgedu_order;”
### 2. 查询优化
– 创建复合索引:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “CREATE INDEX idx_user_id_order_time ON fgedu_order(user_id, order_time);”
– 优化SQL语句:
– 避免SELECT *:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount, order_time FROM fgedu_order WHERE user_id = 123456 AND order_time >= ‘2026-01-01’;”
– 使用LIMIT:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SELECT order_id, user_id, order_amount, order_time FROM fgedu_order WHERE user_id = 123456 AND order_time >= ‘2026-01-01’ LIMIT 10;”
– 收集统计信息:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “ANALYZE TABLE fgedu_order;”
### 3. 验证效果
– 测试查询性能:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “SET profiling = 1; SELECT order_id, user_id, order_amount, order_time FROM fgedu_order WHERE user_id = 123456 AND order_time >= ‘2026-01-01’; SHOW PROFILE;”
– 分析执行计划:
$ obclient -h192.168.1.10 -P2881 -uroot@fgedudb -p -e “EXPLAIN SELECT order_id, user_id, order_amount, order_time FROM fgedu_order WHERE user_id = 123456 AND order_time >= ‘2026-01-01’;”
– 检查慢查询日志:
$ cat /ob/logs/oceanbase/slow_query.log
## 案例总结
– 成功优化了SQL查询,减少了执行时间
– 系统响应速度明显提升
– 验证了查询优化在提高性能中的重要作用
– 建立了查询优化的流程和方法
Part05-风哥经验总结与分享
5.1 性能优化最佳实践
性能优化的最佳实践:
- 全面分析:从硬件、系统、数据库、应用等多个层面进行分析
- 循序渐进:逐步优化,避免一次性大幅修改
- 监控先行:建立完善的监控体系,及时发现性能问题
- 基准测试:在优化前进行基准测试,以评估优化效果
- 持续优化:定期进行性能优化,适应业务需求的变化
- 文档化:记录优化过程和结果,形成知识库
- 团队协作:加强团队协作,共享优化经验
- 培训学习:持续学习性能优化的新技术和方法
5.2 常见性能问题与解决方案
常见性能问题与解决方案:
- CPU使用率高:
- 原因:SQL查询复杂,索引不当,系统负载高
- 解决方案:优化SQL查询,添加合适的索引,调整系统参数
- 内存使用率高:
- 原因:内存泄漏,缓存设置过大,连接数过多
- 解决方案:检查应用代码,调整缓存大小,限制连接数
- 磁盘I/O高:
- 原因:SQL查询导致大量I/O,磁盘性能不足
- 解决方案:优化SQL查询,使用SSD,调整RAID级别
- 网络延迟高:
- 原因:网络带宽不足,网络设备故障
- 解决方案:增加网络带宽,检查网络设备
- 查询执行时间长:
- 原因:SQL语句复杂,索引不当,统计信息过时
- 解决方案:优化SQL语句,添加合适的索引,更新统计信息
5.3 性能调优 checklist
性能调优 checklist:
- 系统层面:
- 文件描述符是否足够?
- 内核参数是否优化?
- 磁盘I/O是否正常?
- 网络带宽是否足够?
- 内存使用是否合理?
- 数据库层面:
- 内存参数是否优化?
- 连接数是否合理?
- 缓存大小是否合适?
- 日志参数是否优化?
- 统计信息是否更新?
- 查询层面:
- SQL语句是否优化?
- 索引是否合适?
- 执行计划是否合理?
- 是否使用了绑定变量?
- 是否避免了全表扫描?
- 应用层面:
- 是否使用了连接池?
- 是否使用了缓存?
- 是否减少了数据库访问?
- 是否优化了代码逻辑?
- 是否合理使用了事务?
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
