性能优化

性能优化是 DBA 和后端开发者的必备技能,掌握 MySQL 性能优化能让你在面试中脱颖而出。

SQL 执行全流程 ⭐⭐⭐⭐⭐

理解 SQL 执行流程是性能优化的基础。

MySQL 架构概览

                           ┌─────────────────────────────────────┐
                           │           客户端                     │
                           └────────────────┬────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│                              Server 层                                        │
│  ┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐          │
│  │    连接器        │ →  │    查询缓存     │ →  │    解析器        │          │
│  │  (Connector)    │    │ (Query Cache)   │    │   (Parser)      │          │
│  │  连接管理/权限   │    │   8.0 已移除    │    │   词法/语法分析  │          │
│  └─────────────────┘    └─────────────────┘    └────────┬────────┘          │
│                                                         │                    │
│                                                         ▼                    │
│                         ┌─────────────────┐    ┌─────────────────┐          │
│                         │    执行器        │ ←  │    优化器        │          │
│                         │   (Executor)    │    │  (Optimizer)    │          │
│                         │   调用存储引擎   │    │   生成执行计划   │          │
│                         └────────┬────────┘    └─────────────────┘          │
└──────────────────────────────────┼───────────────────────────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│                             存储引擎层                                        │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │                          InnoDB                                      │    │
│  │  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐              │    │
│  │  │ Buffer Pool  │  │ Change Buffer│  │  Log Buffer  │              │    │
│  │  │   数据缓存    │  │   写缓冲      │  │   日志缓冲   │              │    │
│  │  └──────────────┘  └──────────────┘  └──────────────┘              │    │
│  └─────────────────────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────────────────────┘


┌──────────────────────────────────────────────────────────────────────────────┐
│                              磁盘存储                                         │
│          表空间文件(.ibd)  │  Redo Log  │  Undo Log  │  Binlog              │
└──────────────────────────────────────────────────────────────────────────────┘

SQL 执行步骤详解

Step 1: 连接器(Connector)

Step 2: 查询缓存(Query Cache) [MySQL 8.0 已移除]

Step 3: 解析器(Parser)

Step 4: 优化器(Optimizer) ⭐⭐⭐⭐⭐

Step 5: 执行器(Executor)


慢查询分析 ⭐⭐⭐⭐⭐

开启慢查询日志

分析慢查询日志

使用 mysqldumpslow

使用 pt-query-digest(推荐)

EXPLAIN 执行计划详解

type 列(访问类型)⭐⭐⭐⭐⭐

从最优到最差

Extra 列(重要提示)⭐⭐⭐⭐

EXPLAIN FORMAT=JSON

EXPLAIN ANALYZE(MySQL 8.0.18+)


SQL 优化技巧 ⭐⭐⭐⭐⭐

索引优化

1. 避免索引失效

2. 利用覆盖索引

3. 最左前缀原则

JOIN 优化

1. 小表驱动大表

2. JOIN 类型选择

3. 避免 JOIN 过多

子查询优化

ORDER BY 优化

GROUP BY 优化

LIMIT 优化

COUNT 优化


表结构优化 ⭐⭐⭐⭐

数据类型选择

数据类型选择指南

场景
推荐类型
说明

主键

BIGINT UNSIGNED

防止溢出

状态/枚举

TINYINT

0-255

年龄

TINYINT UNSIGNED

0-255

金额

DECIMAL(M,N)

精确计算

时间

DATETIME

8 字节,范围大

IP 地址

INT UNSIGNED

用 INET_ATON() 转换

UUID

BINARY(16)

比 CHAR(36) 省空间

大文本

TEXT

不要用 VARCHAR(65535)

是/否

TINYINT(1)

不要用 CHAR(1)

字符集选择

范式与反范式

垂直拆分

水平拆分


InnoDB 参数调优 ⭐⭐⭐⭐⭐

Buffer Pool 配置

Buffer Pool 结构

Redo Log 配置

其他重要参数


连接池优化 ⭐⭐⭐

MySQL 连接数配置

应用层连接池

ProxySQL 中间层


缓存策略 ⭐⭐⭐⭐

应用层缓存

缓存问题与解决

数据库缓存


读写分离 ⭐⭐⭐⭐

主从架构

实现方案

主从延迟处理


监控与诊断 ⭐⭐⭐⭐

关键指标监控

Performance Schema

sys Schema(MySQL 5.7+)


面试高频问题 ⭐⭐⭐⭐⭐

Q1: MySQL 慢查询如何优化?

优化步骤


Q2: 如何判断一条 SQL 是否需要优化?

判断标准


Q3: 深分页问题如何解决?

问题

解决方案


Q4: 如何优化 COUNT(*) 查询?

方案


Q5: Buffer Pool 如何配置?

配置建议


Q6: 如何处理主从延迟?

解决方案


Q7: 如何定位线上 MySQL 问题?

排查步骤


Q8: innodb_flush_log_at_trx_commit 参数如何选择?

选项说明

行为
性能
安全性

0

每秒刷盘一次

最高

可能丢失 1 秒数据

1

每次提交都刷盘

较低

最安全(默认)

2

每次提交写入 OS 缓存,每秒刷盘

中等

系统崩溃可能丢数据

建议

  • 金融系统:1(最安全)

  • 普通业务:2(平衡)

  • 允许少量丢失:0(最快)


总结

核心要点

1. SQL 优化

  • 避免索引失效

  • 利用覆盖索引

  • 小表驱动大表

  • 优化深分页

2. 表结构优化

  • 选择合适的数据类型

  • 适当反范式设计

  • 垂直/水平拆分

3. 参数调优

  • Buffer Pool 配置

  • Redo Log 配置

  • 连接数配置

4. 架构优化

  • 读写分离

  • 应用层缓存

  • 连接池优化

优化方法论

记住这些关键点

  • 开启慢查询日志(long_query_time = 1)

  • EXPLAIN 看 type、key、Extra

  • ✅ **避免 SELECT ***

  • 深分页用游标分页

  • Buffer Pool 设为内存的 70-80%

  • innodb_flush_log_at_trx_commit 根据业务选择

  • 主从延迟用强制走主库或半同步复制


相关文档

推荐阅读

  • 《高性能 MySQL》- Baron Schwartz

  • 《MySQL 技术内幕:InnoDB 存储引擎》- 姜承尧

Last updated