架构:
1.Server层(服务层)
作用: 负责数据库的客户端和服务端之间建立连接以及进行身份的认证,除此以外解析SQL语句生成对应的语法树,以及确定SQL怎么进行执行包括是否要使用索引
组成:
查询缓存:在Mysql 8.0之后进行取消了,作用就是说如果这个SQL语句执行过那么就会直接返回结果,但是这个就会出现问题: 1.如果数据库里面的数据发生变化的话那么就要删除查询缓存中的数据
2.因为绝大部分的情况我们SQL都不会重复进行使用那么这个就是会导致我们对于查询缓存的维护成本是大于其带来的收益的
所以综上的话那么就取消了查询缓存
解析器:就是对我们的SQL语句进行一个解析的功能生成一个语法树
预处理器:就是通过SQL的语法查看我们要查的表是不是存在于我们的数据库当中以及我们进行查看的数据列存不存在于这个数据表里面,所以这个总的来说也是一个提升效率的过程
优化器:其就是确定我们的SQL是应该怎么进行一个执行的过程,如:是否会利用到索引如果是联合的索引的话那么利用其中的哪些字段以及需不需要进行一个回表的操作等等,这个就是为了减少我们执行这个SQL语句的时候消耗的资源是尽可能地少
执行器:其就是和存储引擎层进行一个交互也就是调用接口进行实际的操作
2.存储引擎层:
作用: 对数据库里面的数据进行存储以及提取
存储引擎的种类: 1.Innodb(MysqL5.6之后默认的存储引擎) 2.Myisam
面试的问题:
lnnodb和Myisam之间的区别:
1.对于数据以及索引的存储的文件的数目以及位置是不一样的: innodb是将数据以及索引存在同一个文件里面的 但是Myisam 分别将数据存在 MYD以及MYI文件里面分开进行存储
2. 从事务的角度来看: Innodb是支持事务的(这个是因为Mysql的日志体系(这个会在后面文章进行细说)来进行决定的)但是Myisam是不支持事务的
3.从锁的角度来看: lnnodb是支持表锁以及行锁但是MyIsam只支持表锁,所有相对来说如果在并发的场景之下使用Mylsam作为存储引擎的话那么就会使得数据库的并发度特别低
SQL的执行流程:
1.查询语句的执行流程:
上图的话就是整个的过程,其实总体的不难看出来其实总的顺序可以直接理解为:
这个就是我刚刚说的架构的时候不同的组成之间的按照我写的顺序其实就是能够得到充分的理解
2.修改语句的执行流程:
因为涉及到修改数据库里面的数据的话那么这个时候其实就是我们将存储引擎里面的数据进行读取到我们的内存里面但是放在那里呢以及修改完成之后是立刻就会持久化到磁盘中如果是这样的话那么是不是就是会造成一个效率下降,答案肯定是不是的,那么到底是怎么样进行实现的,下面会进行揭晓
总共有三种的刷入策略:
1.事务提交的时候那么就会直接将数据刷入到磁盘中
2.事务提交的时候不是立刻进行将数据刷入到磁盘中而是每隔一秒种进行刷入,这个就会导致如果没有在要刷入的1秒钟的时间范围之内的话数据库出现故障的那么就会导致数据的不一致的问题
解决方案:Mysql的日志体系(下一篇文章会进行细讲)
3.将最新的数据刷入到操作系统的缓存中,这个时候什么时候进行刷入的话那么就会由操作系统来进行决定,那么其实这个的风险更大因为受到的影响更大
拓展的知识:在bufferpool会存在脏数据页以及没有进行修改的数据页
脏数据页 简单来说就是说里面的数据已经进行修改了要持久化到磁盘中也就是刷入的过程
那么在bufferpool对于对于数据页的管理都是通过链表进行管理