(架构 + InnoDB 事务 MVCC):《MySQL 底层探秘①:拆解 InnoDB,读懂事务、MVCC 与日志的底层逻辑》
MySQL深度解析架构、存储引擎、InnoDB核心原理标签MySQL、关系型数据库、InnoDB、事务、B树前言MySQL是互联网行业使用最广泛的开源关系型数据库不管是业务系统、后端服务几乎都离不开MySQL。很多开发只会写SQL对底层架构、存储引擎、事务原理一知半解上线后经常遇到慢SQL、锁等待、事务异常、宕机丢数据等问题。本次MySQL系列分为三篇第一篇整体架构、存储引擎选型、InnoDB底层核心原理重点第二篇索引原理、SQL优化、执行计划、慢查询实战第三篇高可用、主从复制、运维调优、经典线上故障与最佳实践本篇我们先从MySQL整体架构入手理解存储引擎差异吃透InnoDB核心组件。一、MySQL整体分层架构MySQL采用插件式存储引擎架构分为Server层和存储引擎层。Server层是MySQL核心负责连接、权限、SQL解析优化存储引擎负责数据读写不同引擎实现不同。MySQL架构分层表分层组件核心职责连接层连接池、认证模块管理客户端TCP连接账号密码校验权限验证复用连接Server服务层SQL接口、解析器、优化器、执行器接收SQL语法词法解析生成抽象语法树优化器生成最优执行计划执行器调用存储引擎接口执行SQL存储引擎层InnoDB/MyISAM等插件负责数据的存储、读取、事务、锁Server层不管理数据存储细节文件系统层磁盘文件存放表空间、日志文件、配置文件依赖操作系统IO重点Server层是公共层所有存储引擎共用不同存储引擎的差异只在存储引擎层。二、主流存储引擎对比引擎事务支持锁机制索引崩溃安全适用场景InnoDB✅支持ACID事务行锁表锁支持MVCC聚簇索引✅支持崩溃恢复默认引擎业务生产首选读写业务、高并发MyISAM❌无事务仅表锁非聚簇索引❌崩溃容易损坏表只读静态数据低并发场景现在生产基本弃用Memory❌无事务表锁哈希索引❌内存数据重启丢失临时表高速临时数据不持久化Archive❌无事务无锁无索引✅简单持久化海量归档写入只插入极少查询生产环境统一选择InnoDBMySQL5.5之后默认引擎。三、InnoDB核心组件InnoDB是MySQL生产唯一推荐引擎核心模块如下组件作用Buffer Pool缓冲池核心内存区域缓存页数据页、索引页减少磁盘IOInnoDB最重要内存模块Redo Log重做日志崩溃恢复核心WAL机制先写日志再刷盘保证宕机数据不丢失Undo Log回滚日志事务回滚、MVCC多版本快照保存数据修改前版本Lock 锁系统行锁、意向锁、表锁控制并发事务访问数据解决并发冲突MVCC多版本并发控制无锁读实现事务隔离级别读不加锁提升并发性能DoubleWrite 双写缓冲区防止页损坏保证数据页写入磁盘安全WALWrite-Ahead Logging预写日志机制核心规则修改数据页先写Redo Log再异步刷Buffer Pool脏页到磁盘。好处随机IO转顺序IORedo Log是顺序写入性能远高于随机刷数据页崩溃恢复宕机后通过Redo Log重做未刷盘的修改保证数据一致性四、事务与ACID、隔离级别ACIDA 原子性事务要么全部成功要么全部失败由Undo Log实现C 一致性事务执行前后数据完整性保持一致I 隔离性多个并发事务之间互相隔离由锁MVCC实现D 持久性事务提交修改永久保存宕机不丢失由Redo Log实现事务四大隔离级别隔离级别脏读不可重复读幻读InnoDB实现方式读未提交 READ UNCOMMITTED✅存在✅存在✅存在几乎不用读已提交 READ COMMITTEDRC❌无✅存在✅存在MVCC每次读生成新快照可重复读 REPEATABLE READRRMySQL默认❌无❌无✅存在InnoDB通过间隙锁解决MVCC事务开启生成快照间隙锁串行化 SERIALIZABLE❌无❌无❌无所有读加共享行锁并发极差名词解释脏读读到其他事务未提交的数据不可重复读同一事务内两次读取同一行中间被其他事务修改提交两次结果不一样幻读同一事务范围查询其他事务插入新行导致前后行数不一致五、MVCC多版本并发控制原理MVCC就是保存数据多个版本实现快照读不加锁提升并发。快照读普通select读取历史版本不加行锁当前读select … for update / update / delete读取最新版本加行锁每行隐藏字段DB_TRX_ID最后修改该行的事务IDDB_ROLL_PTR回滚指针指向Undo Log里旧版本数据DB_ROW_ID没有主键时自动生成的隐藏主键事务通过Read View判断版本可见性RR隔离级别在事务第一次快照读时生成Read ViewRC每次快照读都会新建Read View。第一篇小结本篇我们学习MySQL分层架构、存储引擎选型重点理解InnoDB缓冲池、Redo/Undo日志、WAL、事务ACID、四大隔离级别和MVCC。这是MySQL底层基础索引、锁、主从、慢SQL都建立在这套基础之上。第二篇我们讲解B树索引、索引设计原则、explain执行计划、慢SQL定位与SQL优化实战。