MySQL架构
1 MySQL逻辑架构

- 第一层是客户端,比如连接处理、授权认证、安全等待;
- 第二层为MySQL核心服务功能,包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数)所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等;
- 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。
优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读写顺序,以及选择合适的索引等。
优化器并不关心表使用的是什么存储引擎,但存储殷勤对于优化查询是有性能影响的,优化器会请求存储引擎提供容量或某个具体操作的开销信息,以及表数据的统计信息等。
对于SELECT语句,在解析查询之前,服务器会先检查查询缓存(Query Cache),如果能够在其中找到对应的查询,服务器就不必再去执行查询解析、优化和执行的整个过程,而是直接返回查询缓存中的结果集。
2 并发控制
2.1 读写锁
读锁时共享的,写锁时排他的。
2.2 锁粒度
- 表锁(table lock):一条对写操作的语句会先获取写锁,获得后会阻塞其他对该表的所有读写操作,即它会锁定整张表。
- 行级锁(row lock):可以最大程度地支持并发处理(同时也带来最大的锁开销)。
3 事务
事务内的语句,要么全部执行成功,要么全部执行失败。
ACID:
- 原子性(atomicity):要么全部提交成功,要么全部失败回滚。
- 一致性(consistency):数据库总是从一个一致性状态转换到另一个一致性状态。
- 隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。可根据需求调整相应的隔离级别。
- 持久性(durability):一旦事务提交,则所做的修改也会永久保存到数据库中。
3.1 隔离级别
一般分为四种隔离级别:
- 未提交读(READ UNCOMMITTED):事务的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,这也被称为脏读。
- 提交读(READ COMMITTED):也叫做不可重复读。一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的,该级别可能导致两次执行同样的查询,可能会得到不一样的结果。
- 可重复读(REPEATABLE READ):该级别保证了同一个事务中多次读取同样记录的结果是一致的。该级别是MySQL默认事务隔离级别。
- 可串行化(SERIALIZABLE):是最高的隔离级别,它通过强制事务串行执行,避免了各种并行带来的脏读、幻读问题。
| 隔离级别 | 脏读可能性 | 不可重复度可能性 | 幻读可能性 | 加锁读 |
|---|---|---|---|---|
| READ UNCOMMITTED | YES | YES | YES | NO |
| READ COMMITTED | NO | YES | YES | NO |
| REPEATABLE READ | NO | NO | YES | NO |
| SERIALIZABLE | NO | NO | NO | YES |
3.2 死锁
死锁是指两个或多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,从而导致恶行循环的现象。
3.3 事务日志
事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久化以后,内存中被修改得数据在后台可以慢慢刷回到磁盘。
目前大多数存储引擎都是这样实现的,通常称之为预写式日志(Write-Ahead Logging),修改数据需要写两次磁盘。
4 总结
MySQL拥有分层的架构,上层是服务器层的服务和查询执行引擎,下层则是存储引擎。虽然有很多不同作用的插件API,但存储引擎API还是最重要的。如果能理解MySQL在存储引擎和服务层之间处理查询时如何通过API来回交互,就能抓住MySQL的核心基础架构的精髓。

浙公网安备 33010602011771号