【MySQL 执行流程和缓冲池】

MySQL

MySQL 执行流程和缓冲池
MySQL 事务
MySQL 日志–redo log
MySQL 日志–undo log

本文参考尚硅谷康师傅的 MySQL课程


服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示


1、服务器处理客户端请求

简化图:
处理客户端请求


具体图:
具体

1.1、分层处理

1.1.1、连接层

客户端访问 MySQL是,做的第一件事就是建立TCP连接
经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取

  1. 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
  2. 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限

TCP连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。

1.1.2、服务层

SQL Interface: SQL接口
  • 接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT … FROM就是调用SQL Interface
  • MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口
Parser: 解析器
  • 在解析器中对 SQL 语句进行语法分析、语义分析
  • 验证该客户端是否具有执行该查询的权限
Optimizer: 查询优化器
  • SQL语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个执行计划
  • 按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户
Caches & Buffers: 查询缓存组件
  • MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结
    果,如果能够在其中找到对应的查询结果,那么就不必再进行查询解析、优化和执行的整个过
    程了,直接将结果反馈给客户端。
  • 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等 。
  • 这个查询缓存可以在 不同客户端之间共享 。
  • 从MySQL 5.7.20开始,不推荐使用查询缓存,并在 MySQL 8.0中删除

1.1.3、引擎层

插件式存储引擎层( Storage Engines), 真正的负责了MySQL中数据的存储和提取,对物理服务器级别 维护的底层数据执行操作 ,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样 我们可以根据自己的实际需要进行选取

1.1.4、存储层

所有的数据,数据库、表的定义,表的每一行的内容,索引,都是存在文件系统上,以文件的方式存在的,并完成与存储引擎的交互

1.2、小结

可以简化为三层:

  1. 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端
  2. SQL 层(服务层):对 SQL 语句进行查询处理;与数据库文件的存储方式无关
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取

小结


2、SQL 执行流程

2.1、MySQL 中的 SQL 执行流程


执行流程


MySQL 的查询流程

2.1.1、查询缓存

Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。

大多数情况查询缓存就是个鸡肋,为什么呢?

  • 只有相同的查询操作才会命中查询缓存。两个查询请求在任何字符上的不同(例如:空格、注释、 大小写),都会导致缓存不会命中。因此 MySQL 的查询缓存命中率不高
  • 如果查询请求中包含某些系统函数用户自定义变量和函数、一些系统表,如 mysql 、 information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存
  • 只要该表的结构或者数据被修改,那使用该表的所有高速缓存查询都将无效并从高速缓存中删除!对于更新压力大的数据库来说,查询缓存的命中率会非常低

2.1.2、解析器


解析器


如上图,解析器会进行词法分析语法分析,如果SQL 语句正确,则会生成类似语法树如下图


语法树


2.1.3、优化器

在优化器中会确定 SQL 语句的执行路径

2.1.4、执行器

在执行之前需要判断该用户是否具备权限。如果没有,就会返回权限错误。如果具备权限,就执行 SQL查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

流程


3、数据库缓冲池

InnoDB 存储引擎是以页为单位来管理存储空间的,我们进行的增删改查操作其实本质上都是在访问页面(包括读页面、写页面、创建新页面等操作)。而磁盘 I/O 需要消耗的时间很多,而在内存中进行操作,效率则会高很多,为了能让数据表或者索引中的数据随时被我们所用,DBMS 会申请 占用内存来作为
数据缓冲池 ,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool 之后才可以访问。

3.1、缓冲池VS查询缓存

3.1.1 缓冲池

缓冲池的内容

InnoDB 缓冲池包括了数据页索引页插入缓冲锁信息自适应 Hash数据字典信息等

缓冲池内容

缓冲池的预读

缓冲池的作用就是提升I/O效率,而我们进行读取数据的时候存在一个“局部性原理”,也就是说我们使用了一些数据,大概率还会使用它周围的一些数据,因此采用“预读”的机制提前加载,可以减少未来可能的磁盘I/О操作。

3.1.2、 查询缓存

查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是,在MySQL 中的查询缓存,不是缓存查询计划,而是查询对应的结果。因为命中条件苛刻,而且只要数据表发生变化,查询缓存就会失效,因此命中率低。

3.2、 缓冲池读取数据

缓冲池管理器会尽量将经常使用的数据保存起来,在数据库进行页面读操作的时候,首先会判断该页面是否在缓冲池中,如果存在就直接读取,如果不存在,就会通过内存或磁盘将页面存放到缓冲池中再进行读取。

3.3、缓冲池的大小

查看

show variables like 'innodb_buffer_pool_size';

修改

set global innodb_buffer_pool_size = 268435456;

或者

[server]
innodb_buffer_pool_size = 268435456

多个缓冲池

[server]
innodb_buffer_pool_instances = 2
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值