1.Mysql的逻辑架构
第一层是基于网络客户端的连接处理工具架构,并非Mysql独有,第二层是Mysql的核心部分,大多数核心功能都在这一层,包括查询、解析、分析、优化等,存储过程、触发器和视图都在这一层实现
第三层包含了存储引擎,除了InnoDB外,存储引擎不会去解析SQL。
2.优化与执行
MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等。用户可以通过特殊的关键字提示(hint)优化器,影响它的决策过程。也可以请求优化器解释(explain)优化过程的各个因素,使用户可以知道服务器是如何进行优化决策的,并提供一个参考基准,便于用户重构查询和schema、修改相关配置,使应用尽可能高效运行。且优化器不会关心下层的存储引擎是什么,但是存储引擎会影响优化查询的性能。对于SELECT语句,解析查询前Mysql会首先检查查询缓存,在里面找到则不必执行查询解析、优化和执行的过程
3.读写锁(共享锁和排他锁)
读锁即共享,同一时间有多个进程、线程可以获取这个锁,但是写锁即排他,仅有一个进程、线程能够执行写入。大多数时候,Mysql锁的内部管理是透明的。
4.粒度锁(表级锁、行级锁)
表锁会锁定整张表,一个用户在对表进行写操作时,需要先获得写锁,且写锁会优先抢占而读锁不能。
行锁只在存储引擎层实现,而MYSQL服务器层没有实现。
5.事务
一个事务的所有操作,要么同时成功要么同时失败。其具有原子性、一致性、隔离性和持久性。
6.隔离级别
RU:未提交读,即事务中的修改即使没有提交对其他事务也是可见的,会导致脏读、幻读、不可重复读
RC:提交读,一个事务提交了的修改对其他事务才是可见的,但是会导致不可重复读、幻读
RR:可重复读,解决了不可重复读,InnoDB引擎解决了幻读
S:串行化:没有并发,解决了并发的一切问题。
7.Mysql中的事务
Mysql默认采用自动提交,即如果不显示得开启一个事务,则每个查询都被当做是一个事务执行提交操作。可以通过AUTOCOMMIT=0禁止自动提交。不要在事务中混合使用存储引擎,会导致在事务回滚的时候,非事务的表始终无法回滚。InnoDB引擎采用的是两阶段锁定,在事务执行过程中,随时可以执行锁定,这些锁定是隐式的,由InnoDB根据隔离级别自动加锁。
8.多版本并发控制(MVCC)
可以认为MVCC是行级锁的变种,但是其在很多情况下避免了加锁操作,因此具有更低的开销,大多实现了非阻塞的读操作,写操作也只是锁定操作的行。具体的,MVCC的实现是通过保存数据在某个时间点的快照来实现的,也就是不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表同一时刻看到的数据可能是不一样的。典型的有乐观控制和悲观控制。且MVCC只在RR以及RC两个隔离级别下工作。
9.InnoDB的MVCC
其是通过在每行记录后边保存两个隐藏的列来实现的。这两个列一个保存了行的创建时间,一个保存了行的过期时间(删除时间)。当然是用系统版本号来代替的时间值。每个事务开启时,版本号都会递增。具体的MVCC实现原理如下:
这使得大多数读操作都不需要加锁,减少了锁的消耗,使得性能好操作简单。但是需要额外的维护存储空间和行检查。
10.Mysql的存储引擎
在Mysql中,每个表会有一个同名的.frm文件保存表的定义,可以使用show table status的命令来进行查看(\G进行转置)
其中,name为表名,engine为存储引擎,rowformat为行的格式,可选参数为Dynamic、Fixed、compressed,Dynamic是行长度可变,一般包含可变字段如varchar/blob,Fixed是行长度固定,只包含固定长度的列如char,Compressed行只在压缩表中存在。rows为行数,对于InnoDB来说,这一行是估计值,而对于其他存储引擎来说,这一行是准确值。avg_row_length是每行平均字节数,Data_length为表数据大小,max_data_length为表最大容量,这和存储引擎有关,index_length为索引大小,data_free为已分配但没有使用的空间,auto_increment为下一个auto_increment值,create_time为表创建时间,update_time为表最后修改时间,check_time使用check table命令的最后时间,collation为默认字符集和字符排序规则,checksum启用保存的是实时校验和,create_options为其他选项,comment为额外信息。
11.InnoDB
这是Mysql默认的事务型引擎,也是使用最广泛的,这是一个被设计用来处理大量短期事务的存储引擎。