MySQL性能优化浅析及线上案例
字数 1431 2025-08-11 08:35:42

MySQL性能优化全面指南

一、数据库性能优化的意义

业务发展初期,数据库量级不高时性能问题不明显。但当数据库达到一定规模后,性能问题会直接影响用户体验,严重时会导致订单和金额损失。因此需要持续关注数据库性能优化。

二、性能优化常见措施

类型 措施 说明
物理级别 提升硬件性能 提高CPU配置、增加内存容量、采用固态硬盘等
应用级别 连接池参数优化 配置合适的超时时长、连接池容量等参数
单表级别 合理运用索引 根据业务需要适当添加和使用索引
库表级别 分库分表 按照用户ID、订单ID、日期等维度分区
监控级别 加强运维 订阅慢SQL日志,利用druid等工具监控

三、MySQL底层架构

MySQL查询请求执行过程重点关注两部分:

  1. Server层:负责查询优化,制定执行计划
  2. 存储引擎层:提供底层基础API

四、MySQL索引构建过程

1. 索引构建原理

InnoDB存储引擎索引构建过程:

  • 数据按页(16K)存储,每页包含页头、页目录和用户数据区域
  • 用户数据区域按主键递增形成单向链表
  • 页目录指向不同分组,利用二分查找快速定位数据
  • 数据量增加时页分裂,页间形成双向链表
  • 最终形成B+树索引结构

2. 索引类型

  • 聚簇索引:叶子节点存储全量数据,数据即索引
  • 非聚簇索引:按照业务字段创建的索引,需要回表查询

3. B+Tree特性

MySQL在B+Tree基础上改进形成双向链表,优势:

  • 处理范围查询(>、<、between and)更高效
  • 叶子节点间双向链接便于范围扫描

五、MySQL索引使用规范

  1. 只为用于搜索、排序或分组的列创建索引
  2. 列不重复值占比大时才建立索引
  3. 索引列类型尽量小
  4. 可为索引列前缀创建索引减少存储空间
  5. 尽量使用覆盖索引避免回表
  6. 让主键自增减少页分裂
  7. 删除冗余和重复索引

六、执行计划关键字段

  • possible_keys:可能用到的索引
  • key:实际使用的索引
  • rows:预估需要读取的记录条数

七、线上案例解析

案例1:字符串与数字类型转换问题

现象:business_id字段(字符串类型)索引时好时坏,性能不稳定

原因:MySQL只能将字符串转数字,不能将数字转字符串。传入数字类型时无法使用索引

解决方案:统一传入参数类型

案例2:条件缺失导致全表扫描

现象:数据库流量激增,CPU达到100%

原因:test判断未进入,patientId和doctor_pin条件未设置,导致全表扫描

解决方案:确保关键查询条件始终有效

案例3:索引选择不当引发CPU飙升

现象:CPU从8%瞬间达到99.92%

原因:新增rx_create_time索引后,优化器在不同数据量下选择了不同索引:

  1. 数据量少时:使用rx_status索引
  2. 数据量多时:使用rx_create_time索引导致大量回表

解决方案:评估索引使用场景,避免优化器误判

八、性能优化推荐书籍

  1. 《MySQL是怎样运行的:从根儿上理解MySQL》
  2. 《高性能MySQL》

九、性能优化感悟

数据库性能优化是复杂课题,需要:

  1. 深入理解MySQL底层原理
  2. 结合实际业务场景
  3. 通过监控及时发现潜在问题
  4. 从他人经验中学习避免重复犯错

通过持续优化和监控,可以显著提升数据库性能,保障业务稳定运行。

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底层原理 结合实际业务场景 通过监控及时发现潜在问题 从他人经验中学习避免重复犯错 通过持续优化和监控,可以显著提升数据库性能,保障业务稳定运行。