MySQL 8.1+性能优化实战,从慢到快。
本文是实战经验,包括问题定位、索引优化、SQL优化、参数调优、架构优化,以及我的经验教训。
一、问题出现
1. 现象
第一个:现象。
- 系统变慢
- 接口超时
- 数据库CPU高
- 慢查询多
- 是问题
现象,是变慢。
2. 影响
第二个:影响。
- 用户体验差
- 投诉多
- 业务受影响
- 很紧急
- 要优化
影响,很大。
3. 初步判断
第三个:初步判断。
- 看起来是数据库问题
- 慢查询多
- CPU高
- 先定位
- 再优化
初步判断,是数据库。
4. 紧急处理
第四个:紧急处理。
- 先限流
- 先降级
- 先恢复
- 再优化
- 是临时方案
紧急处理,是临时的。
5. 开始优化
第五个:开始优化。
- 恢复后
- 开始优化
- 从慢到快
- 是长期的
优化,是长期的。
二、问题定位
1. 定位一:慢查询日志
第一个定位:慢查询日志。
- 开启慢查询日志
- 看哪些SQL慢
- 分析慢SQL
- 是第一步
- 很重要
慢查询日志,是第一步。
2. 定位二:EXPLAIN分析
第二个定位:EXPLAIN分析。
- 用EXPLAIN看执行计划
- 看有没有走索引
- 看扫描行数
- 是关键
- 很重要
EXPLAIN,是关键。
3. 定位三:SHOW PROFILE
第三个定位:SHOW PROFILE。
- 看SQL各阶段耗时
- 看是IO慢
- 还是CPU慢
- 是定位
- 很重要
SHOW PROFILE,是定位。
4. 定位四:性能监控
第四个定位:性能监控。
- 看CPU
- 看IO
- 看内存
- 看连接数
- 是监控
性能监控,是眼睛。
5. 定位五:业务分析
第五个定位:业务分析。
- 看业务逻辑
- 看有没有不必要的查询
- 看有没有N+1
- 是分析
- 很重要
业务分析,是根本。
三、索引优化
1. 优化一:加索引
第一个优化:加索引。
- 慢查询没走索引
- 加索引
- 性能提升明显
- 是最常用的
- 很有效
加索引,是最常用的。
2. 优化二:联合索引
第二个优化:联合索引。
- 多个条件查询
- 用联合索引
- 最左前缀
- 是技巧
- 很有效
联合索引,是技巧。
3. 优化三:覆盖索引
第三个优化:覆盖索引。
- 查询的列都在索引里
- 不用回表
- 性能提升
- 是技巧
- 很有效
覆盖索引,是技巧。
4. 优化四:删除无用索引
第四个优化:删除无用索引。
- 索引不是越多越好
- 无用索引影响写入
- 要删除
- 是优化
- 很重要
删除无用索引,是优化。
5. 优化五:索引失效
第五个优化:索引失效。
- 避免索引失效
- 不要在索引列上用函数
- 不要隐式转换
- 是注意事项
- 很重要
索引失效,要避免。
四、SQL优化
1. 优化一:避免SELECT *
第一个优化:避免SELECT *。
- 只查需要的列
- 减少数据传输
- 可能用覆盖索引
- 是优化
- 很基础
避免SELECT *,是基础。
2. 优化二:分页优化
第二个优化:分页优化。
- 深分页慢
- 用延迟关联
- 用游标分页
- 是技巧
- 很有效
分页优化,是技巧。
3. 优化三:JOIN优化
第三个优化:JOIN优化。
- 小表驱动大表
- 确保JOIN列有索引
- 减少JOIN表数
- 是优化
- 很重要
JOIN优化,是重要。
4. 优化四:子查询优化
第四个优化:子查询优化。
- 子查询可能慢
- 改成JOIN
- 是优化
- 很有效
子查询优化,是有效。
5. 优化五:批量操作
第五个优化:批量操作。
- 批量插入
- 批量更新
- 减少交互次数
- 是优化
- 很有效
批量操作,是有效。
五、参数调优
1. 调优一:innodbbufferpool_size
第一个调优:innodbbufferpool_size。
- 缓存数据和索引
- 设为物理内存的50%-70%
- 是最重要的参数
- 很关键
buffer_pool,是最重要的。
2. 调优二:innodblogfile_size
第二个调优:innodblogfile_size。
- 日志文件大小
- 影响写入性能
- 设大一点
- 是参数
- 很重要
log_file,是重要。
3. 调优三:max_connections
第三个调优:max_connections。
- 最大连接数
- 根据业务设
- 不要太大
- 是参数
- 很重要
max_connections,是重要。
4. 调优四:innodbflushlogattrx_commit
第四个调优:innodbflushlogattrx_commit。
- 事务提交时刷日志
- 1最安全
- 0/2性能好
- 根据业务选
- 是参数
flush_log,是权衡。
5. 调优五:query_cache
第五个调优:query_cache。
- MySQL 8.0已移除
- 不用考虑
- 用应用层缓存
- 是注意
query_cache,已移除。
六、架构优化
1. 优化一:读写分离
第一个优化:读写分离。
- 读多写少
- 读写分离
- 主库写
- 从库读
- 是架构
读写分离,是架构。
2. 优化二:分库分表
第二个优化:分库分表。
- 数据量大
- 分库分表
- 水平拆分
- 垂直拆分
- 是架构
分库分表,是架构。
3. 优化三:缓存
第三个优化:缓存。
- 热点数据缓存
- 用Redis
- 减少数据库压力
- 是架构
- 很有效
缓存,是有效。
4. 优化四:队列
第四个优化:队列。
- 异步操作
- 用消息队列
- 削峰填谷
- 是架构
- 很有效
队列,是有效。
5. 优化五:归档
第五个优化:归档。
- 冷数据归档
- 减少主表数据量
- 提升查询性能
- 是架构
- 很有效
归档,是有效。
七、优化效果
1. 效果一:查询速度
第一个效果:查询速度。
- 优化前:5秒
- 优化后:50毫秒
- 提升100倍
- 很明显
查询速度,提升明显。
2. 效果二:CPU
第二个效果:CPU。
- 优化前:90%
- 优化后:30%
- 下降明显
- 很有效
CPU,下降明显。
3. 效果三:连接数
第三个效果:连接数。
- 优化前:满
- 优化后:正常
- 很明显
- 很有效
连接数,正常了。
4. 效果四:吞吐量
第四个效果:吞吐量。
- 优化前:100 QPS
- 优化后:1000 QPS
- 提升10倍
- 很明显
吞吐量,提升明显。
5. 效果五:用户体验
第五个效果:用户体验。
- 优化前:超时
- 优化后:秒开
- 用户满意
- 很明显
用户体验,提升明显。
八、经验教训
1. 教训一:不要只加索引
第一个教训:不要只加索引。
- 索引不是万能的
- 还要优化SQL
- 还要优化架构
- 是教训
不要只加索引,是教训。
2. 教训二:要监控
第二个教训:要监控。
- 要有监控
- 及时发现问题
- 不要等出问题
- 是教训
要监控,是教训。
3. 教训三:要测试
第三个教训:要测试。
- 优化要测试
- 不要直接上生产
- 要有验证
- 是教训
要测试,是教训。
4. 教训四:要备份
第四个教训:要备份。
- 优化前要备份
- 出问题能回滚
- 是教训
- 很重要
要备份,是教训。
5. 教训五:持续优化
第五个教训:持续优化。
- 优化不是一次性的
- 要持续
- 要监控
- 要改进
- 是教训
持续优化,是长期的。
九、写在最后
MySQL 8.1+性能优化实战,从慢到快。
问题出现:现象、影响、初步判断、紧急处理、开始优化。问题定位:慢查询日志、EXPLAIN分析、SHOW PROFILE、性能监控、业务分析。索引优化:加索引、联合索引、覆盖索引、删除无用索引、索引失效。SQL优化:避免SELECT *、分页优化、JOIN优化、子查询优化、批量操作。参数调优:bufferpool、logfile、maxconnections、flushlog、query_cache。架构优化:读写分离、分库分表、缓存、队列、归档。
2023年了,MySQL 8.1发布了,性能优化是每个DBA和开发都要面对的问题。从问题定位,到索引优化,到SQL优化,到参数调优,到架构优化,一步步来,从慢到快。
最后,用一句话总结:"MySQL性能优化,从定位开始,索引是基础,SQL是关键,参数是辅助,架构是根本。一步步来,从慢到快,持续优化。"
希望我的实战经验,能帮你优化MySQL性能,从慢到快。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录