mysql的存储引擎架构把查询处理及其他系统任务和数据的存储/提取相分离
1.1 mysql逻辑架构
第一层:链接处理、授权认证、安全等大多数基于网络的工具或者服务都有类似的架构
第二层:核心服务,查询解析、分析、优化、缓存、所有的内置函数(日期、时间等),所有跨存储引擎的功能,存储过程、触发器、视图等
第三层:存储引擎,负责数据的存储和提取
1.1.1 连接管理与安全性
每个客户端连接都会在服务器进程中拥有一个线程,服务器会缓存线程,
1.1.2 优化与执行
mysql会解析查询,并创建解析书,然后优化。
在查询之前,会先检查查询缓存
1.2 并发控制
1.2.1 读写锁
读锁和写锁
1.2.2 锁颗粒
表锁:
行级锁:可以最大程度的支持并发,只在存储引擎层实现
1.3 事务
原子性、一致性、隔离性、持久性
1.3.1 隔离级别
未提交读:事务的修改,即使没有提交,对其他事务也都是可见的。脏读
提交读:一个事务只能看见已经提交的事务的修改。不可重复读
可重复读:保证了同一个事务中多次读取同样记录的结果是一致的,mvcc,mysql默认隔离级别
可串行化:强制事务串行执行
1.3.2 死锁
各种死锁检测和死锁超时机制,innodb目前处理死锁的方法是,将持有最少行级排他锁的事务回滚
1.3.3 事务日志
使用事务日志,存储引擎在修改表数据时只需要修改其内存拷贝,再把行为记录到持久在硬盘的事务日志中。事务日志是追加的方式,因此是顺序IO。
事务日志持久后,内存中被修改的数据可以慢慢地刷回磁盘。预写式日志,修改数据需要写两次磁盘
1.3.4 mysql中的事务
默认采用自动提交,innodb采用两阶段锁定协议
1.4 多版本并发控制
mvcc是行级锁的变种,很多情况下避免了加锁操作,是通过保存数据在某个时间点的快照来实现的,
innodb的mvcc通过在每行记录后面保存两个隐藏的列,一个是行的创建时间,一个是行的删除时间,存储的并不是时间值,而是系统版本号。
每开始一个新的事务,系统版本号就会递增,系统版本号会作为事务的版本号
select:innodb会根据两个条件检查每行记录:
a.只查找版本早于当前事务版本的数据行
b.行的删除版本要么未定义,要么大于当前事务版本号
insert:为新行保存当前系统版本号
delete:为删除行保存当前系统版本号为行删除标识
update:插入一行,保存当前系统版本号,同时保存当前系统版本号到原来的行作为行删除标识
1.5 存储引擎
每个数据库保存为数据目录下的一个子目录,下面.frm文件保存表的定义,
来源:https://www.cnblogs.com/liulanle/p/8327459.html