Mysql 逻辑架构
第一层并不是Mysql独有,大多数基于网络的客户端/服务器工具或者服务器都有类似的架构
第二层是Mysql核心部分,包括查询解析,分析,优化,缓冲,以及所有内置函数都在这一层实现,所有跨存储引擎的功能都在这一层实现
第三层主要是存储引擎,存储引擎负责Mysql中的数据存储和提取,每个存储引擎都有它的优势和劣势,服务器通过API与存储引擎进行通信
连接管理和安全性
当客户端连接到Mysql时,服务器需要对其进行认证,认证基于用户名,原始主机信息和密码,如果客户端认证成功,服务器会继续验证该客户端是否具有执行某些特定查询的权限。
优化与执行
Mysql 会解析查询,并创建内部数据结构,解析树,然后对其进行各种优化,包括重写查询,决定表的读取顺序,以及选择合适的索引等。
在解析查询之前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不必在执行查询解析,优化,和执行整个过程,而是直接返回查询缓冲中的结果集。
并发控制
无论何时,只要有多个查询需要在同一时刻修改数据,都会产生并发控制的问题,Mysql在两个层面进行并发控制:服务器层和存储引擎层
读写锁
并发控制的解决思路很简单,在处理并发读或者写时,可以通过一个有两种类型的锁组成的锁系统来解决问题,这两种类型通常被称为共享锁和排它锁,也叫读锁和写锁
读锁:读锁是共享的,或者说是互相不阻塞的,多个客户端同时读取一个资源时,互不干扰
写锁:写锁是排他的,写锁会阻塞其他的写锁和读锁,处于安全策略考虑,只有这样,才能确保在给定时间里,只有一个人能执行写入。
锁粒度
提高共享资源的并发性的方式就是让锁定的对象具有选择性,尽量只锁定需要修改的部分数据,而不是全部资源,能够有效的提高并发,目前大多数和商业引擎施加的都是行级别的锁,下面介绍两种锁的粒度:
表锁(table lock):他会锁定整张表,在一个用户进行写操作前,需要先获得写锁,这会阻塞其他用户对该表的室友读写操作,只有没有写锁时,其他用户才能获得读锁,读锁之间是不互相阻塞的
行级别锁(row lock):行级别的锁可以最大程度支持并发处理,行级别的锁只能在存储引擎层实现
事务
事务是一组原子性的Sql查询,或者说是一个独立的工作单元,事务内的语句,要么全部执行成功,要么全部执行失败
事务特性
事务具有四大特性(ACID):
原子性(atomicity):一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对一个事务来说,不可能只执行其中一部分,这就是事务的原子性
一致性(consistency):数据库总是从一个一致性的状态转换到另外一个一致性的状态
隔离性(isolation):通常来说一个事物所做的修改对另外一个事务来说是不可见的
持久性(durability):一旦事务提交,则其所作的修改就会永久性的保存到数据库中,及时系统崩溃,修改的数据也不会丢失
隔离级别
隔离级别,较低的隔离级别通常可以执行更高的并发,系统开销也更低,下面介绍四种隔离级别:
未提交读(READ UNCOMMITTED):事务的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,这也被称为脏读,这个级别通常来说有很多问题,实际应用中很少使用
提交读(READ COMMITTED):事务从开始到提交之前,对其他事务都是不可见的,这种级别也叫不重复读,因为两次执行相同的查询,可能会得到不同的结果
可重复读(REPEATABLE READ):保证在同一个事务中多次读取相同的记录结果是一致的,但是可重复度还是会出现幻读,所谓幻读,就是指当某个事务在读取某个范围内的记录时,另外一个事务又在该范围插入新的记录,但之前的事务再次读取该范围时,会产生幻行,InnoDB通过MVCC来解决幻读的问题。
可串行化(SERIALIZABLE):SERIALIZABLE在读取没遗憾数据都加上锁,实际应用中很少使用这个级别的数据,只有在非常需要确保数据一致性而且可以接受没有并发的情况下,才考虑该级别
死锁
死锁:死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用资源,从而导致恶性循环的现象。死锁会造成非常慢的查询 InnoDB解决死锁的方式是持有最少行级别的排它锁事务进行回滚。
事物日志
事务日志可以帮助提高事务效率,使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,事务日志采用追加的方式,因此在写入磁盘上市使用的是一块顺序的IO,而不是随机的IO需要在磁盘上多个地方移动磁头,因此使用事务日志的方式相对来说要快很多。
事务日志持久化后,内存修改的数据在后台可以慢慢刷回磁盘,目前大多数存储引擎都是这样实现的,我们称为预写式日志,修改数据需要写两次磁盘。
Mysql中的事务
自动提交:也就是说,如果不是显示的开始一个事务,则每个查询都被当做一个事务执行一次提交操作。在事务中混合使用存储引擎:非事务型存储引擎变更后就无法撤销,这时候mysql只有在回滚的时候发出警告。
隐式和显式锁定:在事务执行过程中,随时都可以执行锁定,锁只有在commit或者rollback时候才会被释放,而且是统一是同所有的锁被释放
领取专属 10元无门槛券
私享最新 技术干货