1、MySQL架构
大体来说,MySQL可以分为Server层和存储引擎层两部分:
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。
2、日志系统
- redo log:保证 crash-safe 能力
- binlog:主从同步,高可用
- undo log:事务回滚,实现 MVCC
参考资料:
必须了解的mysql三大日志-binlog、redo log和undo log
3、索引
索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。
数据结构选择
- 哈希表这种结构适用于只有等值查询的场景,不适合做区间查询
- 有序数组在等值查询和范围查询场景中的性能就都非常优秀,但更新成本高
- 为了兼顾查询和更新的效率,并减少磁盘 IO,InnoDB 选择了 B+ 树
Tips:B树与B+树
参考资料:
4、事务
简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在 MySQL 中,事务支持是在引擎层实现的。你现在知道,MySQL 是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务,这也是 MyISAM 被 InnoDB 取代的重要原因之一。
MVCC:
图中的三个虚线箭头,就是 undo log;而 V1、V2、V3 并不是物理上真实存在的,而是每次需要的时候根据当前版本和 undo log 计算出来的。比如,需要 V2 的时候,就是通过 V4 依次执行 U3、U2 算出来。
5、锁
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。
根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。
MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁。
在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。
行锁,分成读锁和写锁:
参考资料: