如果能在头脑中构建衣服MySQL各组件之间如何协同工作的架构图,就会有助于深入了解MySQL服务器。如图:
该架构分为三层:
最上层的服务并不是MySQL所独有的,大多数基于网络的客户/服务器的工具或者服务都有类似的架构。
第二层架构是MySQL比较有意思的部分。大多数MySQL的核心服务功能都在这一层,包括查询解析,分析,优化
缓存,以及所有的内置函数,所有的跨存储引擎的功能都在这一层实现: 存储过程,触发器,视图等。
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。每个存储引擎都有它的优势和劣势。服务器通过
API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。
存储引擎API包含几十个底层函数,用于执行诸如"开始一个事务" 或者 "根据主键提取一行记录"等操作。
但存储引擎不会去解析SQL,不同存储引擎之间也不会相互通信,而只是简单的响应上层服务器的请求。
然后让我们再来认识认识一些MySQL的基本概念。
1. 连接管理与安全性
每个客户端连接都会服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者CPU中运行。
服务器会负责缓存线程,因为不需要为每一个新建的连接创建或者销毁线程。
客户端连接MySQL服务器是需要进行验证的。
2.优化和执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行优化, 包括重写查询,决定表的读取顺序,以及选择合适的索引等。
用户还可以通过特殊的关键字提示(hint)优化器来影响它的决策过程。(后续都会有详细介绍)
优化器并不关心表使用的是什么存储引擎,但存储引擎对优化查询是有影响的。
3.并发控制
MySQL在多个查询需要在同一时刻修改数据,都会产生并发控制的问题。
MySQL在两个不同的层面存在并发控制:服务器层和存储引擎层。
4.读写锁
并发控制的一种很简单的解决方案,就是读写锁。在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。
这两种类型的锁通常被称为共享锁和排他锁,也叫读锁和写锁。
锁的具体概念如下:读锁是共享的,或者说是互相不阻塞的。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁。
5.锁粒度
表锁
行级锁 (innoDB和XtraDB以及其他一些存储引擎中实现了行级锁,行级锁只在存储引擎层实现,MySQL服务器层没有实现)
6.事务
ACID:
原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)
7.隔离级别
READ UNCOMMITED(未提交读)
READ COMMITTE(提交读)
REPEATABLE READ(可重复读)
SERIALIZABLE(可串行化)
8.死锁
9.事务日志
它可以帮助提高事务的效率。它减少随机磁盘I/O。
目前大多数存储引擎都是这样实现的,我们通常称之为预写式日志(write-Ahead Logging),修改数据需要写两次磁盘。
(在事务提交后,如果直接写入数据,就会产生大量的随机磁盘I/O.
如果使用事务日志,首先将日志写入磁盘,是顺序磁盘I/O,开销会比较小,其次在真正需要写入数据的时候,存储引擎会做相关的顺序优化,尽量减少
I/O的产生,然后再慢慢地刷回到磁盘。)
10. 存储引擎
InnoDB引擎
MyISAM引擎