一、MySQL数据库底层结构
(一)mysql逻辑结构如下:
(二)逻辑结构大概分为2部分:
与客户端交互的Server层 和 底层的 存储引擎层 。
1、Server层:又分为连接器、查询缓存、分析器、优化器和执行器。不同存储引擎使用同个server层。
(1)连接器:包含一个长连接和短连接的问题。长连接是指,如果在连接成功后,客户端持续地有请求,则可以一直使用该连接,但长连接的话,返回的数据会一直存储在内存,导致此时mysql占用的内存较大,要直到连接断了才会释放内存;若一直未断开,当内存占用太大之后,系统就会出现OOM情况,mysql异常关闭重启。短连接则是短时间内每次执行完几个查询之后便断开连接。
(2)查询缓存:Mysql8.0以后删除该板块。原理是当输入查询语句时,先到查询缓存中查找是否存储过该语句,有则查询缓存命中,直接返回结果。但是由于当对一个表中的内容更新时,该表的查询缓存就会完全清空。这对于高更新频率的表而言,查询缓存并不高效。
(3)分析器:词法分析+语法分析。(有点儿像编译原理底层的分析器)
(4)优化器:顾名思义,选择更好的优化方案。如有多个索引时选择最高效的索引;多个表join时选择表的连接顺序,即可能同个语句不同的连接顺序执行的结果相同,但执行的逻辑方法不同,执行效率也不同,所以需要优化器选择。
(5)执行器:先判断权限;调用引擎接口,判断每行的数据是否满足条件并返回,并由执行器将所有满足条件的行作为结果集返回给客户端。
2、存储引擎层:由多个存储引擎组成。支持 InnoDB、MyISAM、Memory 等存储引擎,其中InnoDB从 MySQL 5.5.5 版本开始成为了默认存储引擎,也比较常见。在建表的时候,也可以通过语句规定该语句执行时的存储引擎是其他引擎(比如在 create table 语句中使用 engine=memory, 来指定使用内存引擎创建)
二、MySQL日志系统
1、redo log(重做日志):innodb引擎特有,记录需要更新时,innodb先将记录写到redo log中,并更新内存。之后innodb再将其操作记录更新到磁盘中。redo log是有固定大小的,像一个队列,从头到尾衔接,循环写。redo log可以保证及时数据库异常重启,之前的提交记录也不会丢失——carsh safe.
2、binlog(归档日志):server层
三、事务
事务是访问并可能更新数据库中各种数据项的一个程序执行单元。要么全部成功,要么全部失败。
四个特性:ACID(Atomicity原子性、Consistency一致性、Isoliation独立性、Durability持久性)
事务支持在引擎层执行,都不是所有引擎都支持事务,MyISAM不支持。
1、隔离性又引申出隔离级别的概念
隔离级别主要分为4个级别:未提交读、提交读、可重复读、串行化读。