MySQL 硬核解析专题
第一章:MySQL 基础与架构
MySQL 是一个广泛使用的开源关系型数据库管理系统(RDBMS),它以高效、稳定和易用著称。要深入理解 MySQL,首先得搞清楚它的架构和工作原理。
MySQL 的核心组件
- 连接层:负责处理客户端的连接,包括认证、权限校验和连接池管理。比如,你用
mysql -u root -p
登录时,连接层会校验你的用户名和密码。 - 服务层:解析 SQL、生成执行计划、优化查询。这里有个关键组件叫“查询优化器”,它会决定你的 SQL 是走索引还是全表扫描。
- 存储引擎层:MySQL 的灵魂所在,不同的存储引擎决定了数据如何存储和访问。常见的引擎有 InnoDB(默认)、MyISAM、Memory 等。
- 物理存储层:数据最终落盘的地方,涉及文件系统和硬件。
- 连接层:负责处理客户端的连接,包括认证、权限校验和连接池管理。比如,你用
InnoDB 引擎深入剖析
- B+树索引:InnoDB 的主键索引用的是 B+树,相比 B树,它叶子节点存数据,非叶子节点只存键值,这样能减少 IO,提升范围查询效率。
- 缓冲池(Buffer Pool):内存中的一块区域,用来缓存热点数据和索引页。可以用
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
查看大小。 - 事务与 MVCC:InnoDB 支持 ACID 事务,通过多版本并发控制(MVCC)实现读写不阻塞。简单说,就是每个事务看到的是一份数据快照,而不是实时变化的数据。
第二章:SQL 执行的幕后故事
一条简单的 SELECT * FROM users WHERE age > 18;
是如何执行的?让我们拆开看看。
SQL 解析与优化
- 词法解析:把 SQL 拆成一个个 token,比如
SELECT
、FROM
。 - 语法解析:生成抽象语法树(AST),确保语句合法。
- 查询优化:优化器分析多种执行路径,比如是用
age
上的索引,还是直接扫全表。可以用EXPLAIN
查看执行计划。
- 词法解析:把 SQL 拆成一个个 token,比如
执行流程
- 查询缓存(8.0 之前):如果启用了查询缓存,会先查缓存。
- 存储引擎执行:优化器选好路径后,交给 InnoDB 去拿数据。
- 返回结果:数据从磁盘或缓冲池取出,经过服务层处理后返回客户端。
第三章:性能优化的硬核技巧
MySQL 慢查询是开发者的噩梦,怎么优化?以下是几个硬核方法。
索引优化
- 覆盖索引:让查询只访问索引,不回表。比如
SELECT name FROM users WHERE age = 20
,如果(age, name)
是联合索引,就不用再查表。 - 索引下推(ICP):MySQL 5.6 引入的功能,把部分过滤条件下推到存储引擎层,减少无效数据读取。
- 覆盖索引:让查询只访问索引,不回表。比如
配置调优
- 增大
innodb_buffer_pool_size
,让更多数据驻留在内存。 - 调整
innodb_log_file_size
,适合写密集场景,提升事务日志写入效率。
- 增大
慢查询分析
- 开启慢查询日志:
SET GLOBAL slow_query_log = 'ON';
- 用
mysqldumpslow
或pt-query-digest
分析日志,找出瓶颈 SQL。
- 开启慢查询日志:
第四章:高可用与分布式
单机 MySQL 扛不住高并发怎么办?得引入高可用和分布式方案。
主从复制
- 原理:主库写 binlog,从库通过 IO 线程和 SQL 线程异步同步。
- 配置:主库开启
log_bin
,从库设置relay_log
和read_only
。
读写分离
- 用中间件(如 MySQL Proxy 或 ProxySQL)实现,主库写,从库读。
分库分表
- 垂直拆分:按业务模块拆表。
- 水平拆分:按范围或哈希拆数据,比如按用户 ID 取模。
第五章:实战案例
案例 1:一张表 1 亿行,怎么优化?
- 加索引:针对高频查询字段建索引。
- 分表:按时间或 ID 范围分片。
- 归档:历史数据移到冷表。
案例 2:事务死锁怎么破?
- 用
SHOW ENGINE INNODB STATUS;
查看死锁日志。 - 优化锁粒度,尽量用行锁而非表锁。
- 用