MySQL架构

1 MySQL逻辑架构

image-20210723102214040

  • 第一层是客户端,比如连接处理、授权认证、安全等待;
  • 第二层为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的核心基础架构的精髓。

posted @ 2021-07-23 10:48  bGpi  阅读(74)  评论(0)    收藏  举报