MySQL的体系结构可以分为三层

一、连接层

1.通信协议

负责检测客户端版本是否兼容MySQL服务端

2.线程处理

是指每一个连接请求都会分配一个对应的线程:一条SQL对应一个线程;一个线程对应一个逻辑CPU,并且会在多个CPU之间进行切换

3.用户名密码认证

验证创建的账号和密码、host主机授权是否可以连接到MySQL服务器

二、SQL层

1.权限判断

审核用户有没有访问某个库,某个表

2.查询缓存

Query Cache 进行操作,如果在Query Cache 中,直接返回给客户端
只能缓存静态数据,在数据经常发生变化的时候,使用度不高
5.6版本以后默认关闭

3.解析器

针对SQL语句进行解析,判断语法是否正确

4.预处理

对解析器无法解析的语义进行处理

5.查询优化器

对SQL进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的API接口,通过存储引擎层访问数据

三、存储引擎

InnoDB
特点:
支持事务,
行锁,
支持MVCC多版本并发控制,并发性高
数据和索引文件都存储在.Ibd文件里,并且都缓存在内存里
应用场景:应用于OLTP业务系统

MariaDB columnstore
特点:列式存储引擎,高压缩功能
应用场景:数据仓库,OLAP业务系统

InnoDB体系结构

MySQL是一个单进程多线程模型的数据库

数据库实例=进程+内存

线程:从内存到磁盘

InnoDB引擎构成:1.内存结构;2.线程;3.磁盘文件

InnoDB存储结构:

1.表空间:
(1)系统表空间
(2)(默认使用)独立表空间:设置参数innodb_file_per_table=1
(3)共享表空间:(无法在线回收空间,如果想要回收,需要将全部InnoDB表中的数据备份,删除原表,然后再把数据导回到与原表结构一样的新表中)
(3)临时表空间:
临时表存放路径是固定的
流程:把临时表的数据从系统表空间中抽离出来,形成自己的独立表空间参数,但是相关检索信息还在系统信息表的库下

(4)通用表空间:

2.段:
表空间是由段组成的:数据段、回滚段、索引段
段=N个区+32个页:扩展是以区为单位

创建一个索引就会有两个段:非叶子节点,叶子节点
一个表有4个段

3.区:(固定大小1MB)
由连续的页组成,是物理上连续分配的一段空间

4.页:(默认大小16KB)可调节
1个区=64个连续的页构成
页(page)是最小物理存储分配单位
图片说明
1个页最少可以存两行数据:虚拟最小行,虚拟最大行-----限定记录的范围---------->保证B+Tree是双向链表
图片说明

InnoDB中的数据按照行存储的,行记录数据又是按照行格式存放的。
InnoDB中有两种文件格式:
1.Antelope格式下的记录格式:1.compact(使用最多),2.redundant
2.Barracuda格式下的记录格式:1.compressed,2.dynamic(5.7默认格式)

InnoDB内存结构:

1.SGA(系统全局区)

2.PGA(程序缓存区)

InnoDB三大特性:

1.插入缓冲(提升普通索引插入的性能)
作用:把普通索引上的DML操作从随机输入输出流变成顺序的输入输出流。
工作原理:
1.判断普通索引页是否在缓存池中,在就直接插入
2.不在就先放到 change buffer 中,进行change buffer 和普通索引的合并操作,多个插入合并到一个操作中

2.两次写(保证写入的安全性)
防止在MySQL实例发生宕机时,发生数据页 部分页写的问题
可以通过redo log恢复数据库实例(页的物理操作),但是如果页都损坏了,是无法恢复的

3.自适应哈希索引
监控索引的搜索,建立哈希索引得到优化
https://blog.csdn.net/olizxq/article/details/82313489