MySQL调优深度解析:数据库层面 + SQL层面全攻略
🎯写在前面:MySQL是后端开发中最常用的数据库,而数据库性能优化是每个开发者必须掌握的技能。从索引设计到SQL编写,从配置调优到架构优化,这篇文章将带你全面掌握MySQL调优的核心技能,让你的查询从秒级降到毫秒级!
目录导航
- MySQL架构概览
- 索引核心原理
- 数据库层面调优
- SQL层面调优
- 慢查询优化实战
- 分库分表与读写分离
- 常见面试题
一、MySQL架构概览
1.1 整体架构图
┌─────────────────────────────────────────────────────────────────────────────┐ │ MySQL 整体架构 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌───────────────────────────────────────────────────────────────────┐ │ │ │ 连接层 (Connection Layer) │ │ │ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │ │ │ │ 连接池 │ │ 认证 │ │ 线程管理│ │ 连接限制 │ │ │ │ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │ │ └──────────────────────────┬────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────▼────────────────────────────────────────┐ │ │ │ 服务层 (Server Layer) │ │ │ │ │ │ │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │ │ │ │ │ SQL接口 │ │ 优化器 │ │ 缓存 (Query Cache) │ │ │ │ │ │ DML/DDL/CLR │ │ Optimizer │ │ (MySQL 8.0已移除) │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────────────────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐│ │ │ │ │ 解析器 (Parser) ││ │ │ │ │ 词法分析 ──▶ 语法分析 ──▶ 语义分析 ──▶ 生成执行计划 ││ │ │ │ └───────────────────────────────────────────────────────────────┘│ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌───────────────────────────────────────────────────────────────┐│ │ │ │ │ 查询缓存 (已移除) ││ │ │ │ └───────────────────────────────────────────────────────────────┘│ │ │ └──────────────────────────┬────────────────────────────────────────┘ │ │ │ │ │ ┌────────────────────────────▼────────────────────────────────────────┐ │ │ │ 存储引擎层 (Storage Engine Layer) │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ InnoDB │ │ MyISAM │ │ Memory │ │ Archive │ │ │ │ │ │ (默认/推荐) │ │ (不支持事务)│ │ (内存表) │ │ (归档存储) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └──────────────────────────┬────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────┐ │ │ │ 文件系统层 │ │ │ │ *.frm *.ibd *.MYD *.MYI│ │ │ └─────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────┘1.2 InnoDB vs MyISAM
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ 支持 | ❌ 不支持 |
| 外键约束 | ✅ 支持 | ❌ 不支持 |
| 行锁 | ✅ 支持 | ❌ 表锁 |
| MVCC | ✅ 支持 | ❌ 不支持 |
| 崩溃恢复 | ✅ 自动恢复 | ❌ 需手动修复 |
| 全文索引 | ✅ 5.6+支持 | ✅ 原生支持 |
| 存储结构 | .ibd (表空间) | .MYD + .MYI |
| COUNT(*) | 全表扫描 | 元数据存储 |
| 适用场景 | 事务/高并发 | 只读/静态表 |
1.3 MySQL日志体系
┌─────────────────────────────────────────────────────────────────────────┐ │ MySQL 日志体系 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ Redo Log │ │ Undo Log │ │ Bin Log │ │ │ │ (重做日志) │ │ (回滚日志) │ │ (归档日志) │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 物理日志 │ │ 逻辑日志 │ │ 主从同步 │ │ │ │ 记录页面 │ │ 记录SQL │ │ 数据恢复 │ │ │ │ 修改 │ │ 回滚操作 │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Error Log │ │ Slow Query │ │ │ │ (错误日志) │ │ Log │ │ │ └─────────────┘ │ (慢查询日志)│ │ │ └─────────────┘ │ └─────────────────────────────────────────────────────────────────────────┘ 日志参数配置: ┌─────────────────────────────────────────────────────────────────────────┐ │ │ │ # Binlog配置 │ │ log_bin = mysql-bin │ │ binlog_format = ROW # 推荐ROW格式 │ │ sync_binlog = 1 # 每次事务同步 │ │ expire_logs_days = 7 # Binlog保留7天 │ │ │ │ # Redo Log配置 │ │ innodb_log_file_size = 1G # 日志文件大小 │ │ innodb_log_files_in_group = 3 # 日志文件数量 │ │ innodb_flush_log_at_trx_commit = 1 # 事务提交刷盘策略 │ │ │ └─────────────────────────────────────────────────────────────────────────┘二、索引核心原理
2.1 索引类型全景图
┌─────────────────────────────────────────────────────────────────────────┐ │ MySQL 索引类型 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 按数据结构分 │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ B+Tree │ │ Hash │ │ R-Tree │ │ │ │ │ │ (默认/通用) │ │ (Memory) │ │ (空间位置) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ 按字段特性分 │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ 主键索引 │ │ 唯一索引 │ │ 普通索引 │ │ │ │ │ │ (聚簇索引) │ │ (唯一约束) │ │ (辅助索引) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ │ │ 前缀索引 │ │ 全文索引 │ │ 复合索引 │ │ │ │ │ │(字符串前缀) │ │ (FULLTEXT) │ │(多列组合) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │ │ │ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘2.2 B+Tree索引原理(重点!)
┌─────────────────────────────────────────────────────────────────────────┐ │ B+Tree 结构图 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────┐ │ │ │ 根节点 │ │ │ │ (索引页) │ │ │ └──────┬──────┘ │ │ ┌────────────┼────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │ │ 索引页1 │ │ 索引页2 │ │ 索引页3 │ │ │ │ 索引页 │ │ 索引页 │ │ 索引页 │ │ │ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │ │ │ │ │ │ │ ┌──────────────┼──────────────┼──────────────┼──────────────┐ │ │ ▼ ▼ ▼ ▼ ▼ │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐ ┌────┐│ │ │Data│ │Data│ │Data│ │Data│ │Data│ │Data│ │Data│ │Data│ │Data│ │Data││ │ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘ └────┘│ │ 叶子节点(数据页) │ │ │ │ 特点: │ │ • 平衡多路搜索树 │ │ • 所有数据在叶子节点 │ │ • 叶子节点用双向链表连接 │ │ • 非叶子节点只存储索引(键值) │ │ │ └─────────────────────────────────────────────────────────────────────────┘2.3 聚簇索引 vs 辅助索引
┌─────────────────────────────────────────────────────────────────────────┐ │ 聚簇索引 vs 辅助索引 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ 聚簇索引 (Clustered Index) │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ │ │ │ │ 主键索引 = 聚簇索引 │ │ │ │ │ │ │ │ 特点: │ │ │ │ • 叶子节