MySQL性能优化浅析及线上案例
字数 1431 2025-08-11 08:35:42
MySQL性能优化全面指南
一、数据库性能优化的意义
业务发展初期,数据库量级不高时性能问题不明显。但当数据库达到一定规模后,性能问题会直接影响用户体验,严重时会导致订单和金额损失。因此需要持续关注数据库性能优化。
二、性能优化常见措施
| 类型 | 措施 | 说明 |
|---|---|---|
| 物理级别 | 提升硬件性能 | 提高CPU配置、增加内存容量、采用固态硬盘等 |
| 应用级别 | 连接池参数优化 | 配置合适的超时时长、连接池容量等参数 |
| 单表级别 | 合理运用索引 | 根据业务需要适当添加和使用索引 |
| 库表级别 | 分库分表 | 按照用户ID、订单ID、日期等维度分区 |
| 监控级别 | 加强运维 | 订阅慢SQL日志,利用druid等工具监控 |
三、MySQL底层架构
MySQL查询请求执行过程重点关注两部分:
- Server层:负责查询优化,制定执行计划
- 存储引擎层:提供底层基础API
四、MySQL索引构建过程
1. 索引构建原理
InnoDB存储引擎索引构建过程:
- 数据按页(16K)存储,每页包含页头、页目录和用户数据区域
- 用户数据区域按主键递增形成单向链表
- 页目录指向不同分组,利用二分查找快速定位数据
- 数据量增加时页分裂,页间形成双向链表
- 最终形成B+树索引结构
2. 索引类型
- 聚簇索引:叶子节点存储全量数据,数据即索引
- 非聚簇索引:按照业务字段创建的索引,需要回表查询
3. B+Tree特性
MySQL在B+Tree基础上改进形成双向链表,优势:
- 处理范围查询(>、<、between and)更高效
- 叶子节点间双向链接便于范围扫描
五、MySQL索引使用规范
- 只为用于搜索、排序或分组的列创建索引
- 列不重复值占比大时才建立索引
- 索引列类型尽量小
- 可为索引列前缀创建索引减少存储空间
- 尽量使用覆盖索引避免回表
- 让主键自增减少页分裂
- 删除冗余和重复索引
六、执行计划关键字段
possible_keys:可能用到的索引key:实际使用的索引rows:预估需要读取的记录条数
七、线上案例解析
案例1:字符串与数字类型转换问题
现象:business_id字段(字符串类型)索引时好时坏,性能不稳定
原因:MySQL只能将字符串转数字,不能将数字转字符串。传入数字类型时无法使用索引
解决方案:统一传入参数类型
案例2:条件缺失导致全表扫描
现象:数据库流量激增,CPU达到100%
原因:test判断未进入,patientId和doctor_pin条件未设置,导致全表扫描
解决方案:确保关键查询条件始终有效
案例3:索引选择不当引发CPU飙升
现象:CPU从8%瞬间达到99.92%
原因:新增rx_create_time索引后,优化器在不同数据量下选择了不同索引:
- 数据量少时:使用rx_status索引
- 数据量多时:使用rx_create_time索引导致大量回表
解决方案:评估索引使用场景,避免优化器误判
八、性能优化推荐书籍
- 《MySQL是怎样运行的:从根儿上理解MySQL》
- 《高性能MySQL》
九、性能优化感悟
数据库性能优化是复杂课题,需要:
- 深入理解MySQL底层原理
- 结合实际业务场景
- 通过监控及时发现潜在问题
- 从他人经验中学习避免重复犯错
通过持续优化和监控,可以显著提升数据库性能,保障业务稳定运行。