Mysql基础架构 一条sql的执行过程

mysql基础架构图

在这里插入图片描述 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

Server 层

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,包含了 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

连接器

连接器是当你成功登录到数据库时使用的,主要负责与客户端建立连接、获取权限、维持和管理连接。

  1. 如果用户名或密码不对,你就会收到一个"Access denied for user"的错误,然后客户端程序结束执行。

  2. 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限(意味着当一个用户成功建立连接后,即使你用管理员账号对这个用户的权限做了修改,也不会影响已经存在连接的权限。修改完成后,只有再新建的连接才会使用新的权限设置)。
    可以使用以下命令查看连接

    show processlist
    

如果连接长时间没动静,连接器就会断开该连接(参数 wait_timeout 控制的,默认值是 8 小时)。
连接有长短之分,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。建立连接的过程比较复杂,建议减少建立连接的动作。
但全部使用长连接会导致mysql占用内存增加很快( MySQL 在执行过程中临时使用的内存是管理在连接对象里面),会导致oom,有以下两种解决方法

  1. 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
  2. 执行 mysql_reset_connection 来重新初始化连接资源( MySQL 5.7以上版本)。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态
查询缓存

之前查询过的sql及其结果可以以key-value形式存储在内存中,当mysql接受到一个查询请求后,如果直接在这个缓存中能找到对应的key,就会把这个value返回;如果不能就正常执行后面的动作,执行完成把结果存在缓存中。如果查询能命中缓存会提高很高的效率。

但是查询缓存存在一个致命的缺点就是缓存的失效太频繁,只要有一个更新对表更新的操作,所有缓存全部清空,对于更新操作较多的表,命中率会很低,所以查询缓存适合用于一些静态表、配置表等不经常更新的表。
在mysql8.0后整个查询缓存模块已经不存在了。

分析器

分析器是mysql对sql语句进行语法解析,从你输入的"select"这个关键字识别出来,这是一个查询语句。然后把字符串“T”识别成“表名 T”,把字符串“ID”识别成“列 ID”

select * from t where ID=1;

如果你的语法不动,你就会收到“you have an error in you SQL syntax” 等错误提醒

优化器

经过分析器,mysql已经知道了你要做什么,接下来就会优化具体的查询步骤;
如有多个索引时决定使用哪个索引;
有多个表做连接查询时决定表的连接顺序;等等

执行器

这时mysql已经通过分析器知道了你要做什么,通过优化器知道了该怎么做,接下来就开始执行具体的查询操作。
开始执行时,会判断一下你对这个表有查询的权限,没有就会报错,有的话就会继续执行,然后就会使用执行引擎根据该表定义的接口获取查询结果。

为什么不在分析器做权限判断?( 有时候,SQL语句要操作的表不只是SQL字面上那些。比如有个触发器,这种就需要在执行器阶段(过程中)才能确定)

存储引擎层

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值