今日里程碑:你将不再写那种”一次性脚本”,而是通过函数封装、错误处理编写可用于生产环境的 自动化运维工具;同时,你将掌握数据库性能优化的”黄金法则”。今天不只是写代码,而是要彻底理解 “如何编写健壮的运维脚本”、“如何分析慢查询” 以及 “如何优化数据库性能”。
知识图谱 | Knowledge Map
Shell 运维自动化
- 系统监控:磁盘/内存水位监测
- 逻辑封装:增强健壮性的 Error Handling
- 远程执行:SSH 批量下发指令
- 备份自动化:定时备份脚本
SQL 性能调优
- EXPLAIN 进阶:读懂 type/rows/key_len
- 优化口诀:小表驱动大表、索引失效规避
- 实战案例:千万级大表的分页优化
- 慢查询分析:定位性能瓶颈
代码任务 (90 mins)
1
Shell 生产级脚本实战
我们将编写一个 自动备份与磁盘监控脚本。拒绝硬编码,采用函数式编程。任务分解:常见错误:验证步骤:
- 定义配置变量
- 编写颜色输出函数
- 编写磁盘检查函数
- 编写备份函数
- 编写清理旧备份函数
- 添加错误处理
-
修改配置(根据实际情况):
-
创建测试目录:
-
运行脚本:
-
检查输出:
- 应该看到磁盘使用率检查结果
- 应该看到备份成功信息
- 应该看到备份文件大小
- 应该看到旧备份清理信息
-
验证备份文件:
2
SQL 慢查询优化
我们将学习如何分析和优化慢查询,这是数据库性能优化的核心技能。任务分解:字段类型选择详解:
验证步骤:
- 启用慢查询日志
- 分析慢查询场景
- 优化查询语句
- 对比优化前后的性能
慢查询优化原则
慢查询优化原则
1. 避免全表扫描:
- 为 WHERE 条件中的字段添加索引
- 避免使用
!=、NOT IN、IS NULL(某些情况) - 避免对字段使用函数
- 使用
=、IN、BETWEEN、LIKE 'prefix%' - 遵循最左前缀原则
- 使用覆盖索引减少回表
- 小表驱动大表
- 为 JOIN 条件添加索引
- 避免子查询,使用 JOIN
- 为 ORDER BY 字段添加索引
- 避免
ORDER BY和WHERE使用不同索引
深分页优化详解
深分页优化详解
问题:
或者使用 JOIN:性能提升:
LIMIT 1000000, 10 需要扫描并丢弃前 100 万行,非常慢。优化方案:- 优化前:扫描 100 万+ 行,耗时数秒
- 优化后:扫描索引 + 查询 10 行,耗时毫秒级
小表驱动大表
小表驱动大表
原则:小表作为驱动表,大表作为被驱动表。原因:
- 驱动表会被全表扫描
- 被驱动表通过索引查找
- 小表扫描快,大表通过索引查找也快
-
连接 MySQL:
-
执行 SQL 脚本:
-
分析查询:
-
测试深分页优化:
每日挑战 (Challenge)
Shell 挑战
任务:给备份脚本加上
find $BACKUP_DEST -mtime +7 -delete 命令,实现自动删除 7 天前旧备份的功能。提示:- 使用
find命令查找旧文件 -mtime +7:修改时间超过 7 天-delete:删除找到的文件- 思考:如何添加日志记录删除的文件?
SQL 挑战
任务:使用
SHOW PROFILES 查看你刚才执行的 SQL 到底耗时多少秒。提示:- 启用 profiling:
SET profiling = 1; - 执行查询后:
SHOW PROFILES; - 查看详细分析:
SHOW PROFILE FOR QUERY 1; - 思考:如何对比优化前后的性能差异?
今日产出物
day05/backup_script.sh- Shell 生产级备份脚本day05/04_slow_query_opt.sql- SQL 慢查询优化脚本
参考代码
查看参考代码
在 GitHub 查看完整的示例代码
在线运行
使用在线编辑器测试代码
实际应用场景
Shell 生产级脚本在运维中的应用
- 自动化备份:定时执行备份脚本,确保数据安全
- 系统监控:监控磁盘、内存、CPU 使用率,及时告警
- 日志管理:自动清理旧日志,防止磁盘满
- 部署自动化:编写健壮的部署脚本,减少人工错误
- 故障恢复:编写自动恢复脚本,快速恢复服务
SQL 慢查询优化在生产环境的重要性
- 性能监控:定期分析慢查询日志,定位性能瓶颈
- 索引优化:根据查询模式设计合适的索引
- 查询优化:优化慢查询语句,提高响应速度
- 容量规划:通过性能分析预测数据库容量需求
- 用户体验:优化查询性能,提升用户体验
上一天: 三剑客优化
Day 04 | Shell 三剑客与 SQL 优化
下一天: 整合实战
Day 06 | 第一阶段综合实战