sql语句的执行流程
基本架构图
基本概念
# 大体的来说,MySQL可以分为Server层和存储引擎两部分
Server层
* Server层包含连接器,查询缓存,分析器,优化器,执行器等,
涵盖了MySQL的大多数的核心服务功能,以及所有的内置函数(如日期,时间,数学,和加密函数等)
所有的跨存储引擎的功能都在这一层实现,比如存储过程,触发器,试图等
存储引擎
* 存储引擎层负责数据的存储和提取。
其架构是插件式的,支持InnoDB,MyISAM,Memory等多个存储引擎,现在最常用的存储引擎是InnoDB,它从mysql5.5.5版本之后开始成为默认的存储引擎了
但是也可以再创建表的时候进行修改
不同的存储引擎 的表数据存取方式不同,支持的功能也不同
连接器
* 管理连接,权限验证
* 连接器是连接我们客户端和服务器首先经过的第一个功能模块,当我们不管是使用工具还是使用命令行窗口连接我们的mysql的时候,首先会执行一条语句
mysql -h[ip地址] -P[端口号] -u[用户名] -p[密码]
这句话的意思是让我们的客户端和连接上MySQL的服务器,进而管理mysql
连接器此时来验证我们的用户名和密码是否正确
* 如果连接上之后,没有别的操作的话,则当前连接就正处于一个空闲的转态
当连接上数据库之后,会保持一个连接,这个连接是长连接,直到连接关闭,否则一直保持连接。
中途所有的客户端的请求,都由该连接进行工作。短连接只能保证客户端在某个时间段的请求由该连接进行工作,下次查询将会使用一个新的连接。
* 使用长连接也会有问题
因为长连接保持连接,所以长时间下来,当连接数很多的时候,所占用的内存就会很多
* 解决的办法如下:
1. 定期断开长连接
2. mysql5.7版本之后,每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,速度会比较快
查询缓存
# MYSQL 8.0没有缓存查询的功能,已经被抛弃
* 我们首先可以查看mysql缓存的配置
* 1.query_cache_type
0(off):关闭缓存的功能,任何情况下都不会使用缓存
1(on): 开启缓存,但是当select 语句中使用了SQL_NO_CACHE提示后,将不使用缓存
2(demand):开启缓存查询,当select语句中使用了SQL_CACHE提示后,才使用缓存查询
* 如果为1 又不想使用缓存:
select sql_no_cache * from sys_user
* 如果为2 向使用缓存
select sql_cache * from sys_user
分析器
* 上面所说的是如果开启了缓存的机制,就在缓存里查,否则则就要走分析器了
分析器的作用是:分析你的语句是查询还是更新,还是语法有错误呢,都是由分析器来做的
优化器
* 经过了分析器,msyql就知道你要做查询还是更新操作了 ,此时就到了优化器,目的就是优化你的查询
比如:
select * from sys_user su join sys_dept sd where su.id = '10' and sd.id ='20'
此时可以先从su表中取出id=10的也可以先从sd表中取出id=20的再关联其他的表
* 这两种方案的结果是一样的,但是执行效率会有所不同,而优化器就是解决使用哪一种方案来更加优化
执行器
* 通过分析器知道要做什么,通过优化器知道怎么执行,那么执行器就是结合上面的两种方案来调用相关的执行引擎去表中取数据
以上就是mysq的依据sql语句的执行的流程