linux建站和wordpress,无锡专业网络推广公司,网站作为医院形象建设,wordpress置顶无效在聊mysql的执行流程之前#xff0c;咱们要先聊聊mysql的逻辑架构。
逻辑架构
可以将上图简化为下图
连接层
客服端访问mysql服务器前#xff0c;要先和mysq建立tcp连接。经过3次握手建立连接成功后#xff0c;mysql服务器对tcp传输过来的账号密码进行身份认证#x…在聊mysql的执行流程之前咱们要先聊聊mysql的逻辑架构。
逻辑架构
可以将上图简化为下图
连接层
客服端访问mysql服务器前要先和mysq建立tcp连接。经过3次握手建立连接成功后mysql服务器对tcp传输过来的账号密码进行身份认证权限获取。
用户名或密码不对会收到Access denied for user错误客服端程序结束执行用户名密码认证成功会从权限表查出账号拥有的权限与连接关联之后的权限判断逻辑都依赖于此时读到的权限
连接层有一个线程池每个客服端过来和mysql服务器建立tcp连接都需要分配一个线程专门取和这个客服端交互。使用线程池省去了创建和销毁线程的开销。
服务层
SQL InterfaceSQL接口
接收用户的SQL命令并且返回用户需要查询的结果。例如select ...from就是调用SQL接口
Parser解析器 在解析器中对sql语句进行语法解析语义分析。将sql语句分解成数据结构并将这个数据结构传递给后续步骤以后sql语句的传递和处理就是基于这个结构。如果在分解构成中遇到错误那么就说明这个sql语句是错误的sql命令传递到这个解析器的时候会被解析器验证和解析并为其创建语法树Mysql还会还会对sql查询进行语法上的优化进行查询重写。 Optimizer查询优化器 sql语句在语法解析之后查询之前会使用查询优化器确定sql语句的执行路径生成一个执行计划执行计划里会说明使用哪些索引进行查询表之间的连接顺序如何最后按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询并将查询结果返回给用户他使用“选取-投影-连接”策略进行查询。例如
select id, name from student where gender femaleselect查询会先根据where进行选取而不是将表全部查询出来再进行gender过滤。再根据id和name进行属性投影而不是将属性全部取出来以后在进行过滤将这两个查询条件连接起来就是最终结果。 Cache查询缓存组件
MySQL 中的查询缓存不是缓存查询计划而是查询对应的结果。这就意味着查询匹配的鲁棒性大大降 低只有相同的查询操作才会命中查询缓存。两个查询请求在任何字符上的不同例如空格、注释、 大小写都会导致缓存不会命中。因此 MySQL 的查询缓存命中率不高。同时如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表如 mysql 、 information_schema、 performance_schema 数据库中的表那这个请求就不会被缓存。以某些系统函数 举例可能同样的函数的两次调用会产生不一样的结果比如函数NOW每次调用都会产生最新的当前 时间如果在一个查询请求中调用了这个函数那即使查询请求的文本信息都一样那不同时间的两次 查询也应该得到不同的结果如果在第一次查询时就缓存了那第二次查询的时候直接使用第一次查询 的结果就是错误的此外既然是缓存那就有它缓存失效的时候。MySQL的缓存系统会监测涉及到的每张表只要该表的 结构或者数据被修改如对该表使用了INSERT、 UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE语句那使用该表的所有高速缓存查询都将变为无效并从高 速缓存中删除对于更新压力大的数据库来说查询缓存的命中率会非常低。
引擎层
插件式存储引擎真正负责mysql中数据的存储和提取维护底层数据执行操作服务器通过api与存储引擎进行通信。不同存储引擎功能也不同根据需求而定。
存储层
所有的数据数据库/表表中每一行内容索引都会存在文件系统上。并完成与存储引擎的交互。
sql执行流程
查询缓存Server 如果在查询缓存中发现了这条 SQL 语句就会直接将结果返回给客户端如果没 有就进入到解析器阶段。解析器 在解析器中对 SQL 语句进行语法分析、语义分析。 分析器先做“ 词法分析 ”。你输入的是由多个字符串和空格组成的一条 SQL 语句MySQL 需要识别出里面 的字符串分别是什么代表什么。 MySQL 从你输的select这个关键字识别出来这是一个查询语 句。它也要把字符串“T”识别成“表名 T”把字符串“ID”识别成“列 ID”。接着要做“ 语法分析 ”。根据词法分析的结果语法分析器比如Bison会根据语法规则判断你输 入的这个 SQL 语句是否 满足 MySQL 语法 。如果sql语句正确则会生成一个语法树 优化器 在优化器中会确定 SQL 语句的执行路径比如是根据全表检索 还是根据索引检索等
例如执行两个表的join
select * from test1 join test2 using(ID)
where test1.namezhangwei and test2.namemysql高级课程;方案1可以先从表 test1 里面取出 namezhangwei’的记录的 ID 值再根据 ID 值关联到表 test2再判 断 test2 里面 name的值是否等于 ‘mysql高级课程’。 方案2可以先从表 test2 里面取出 name‘mysql高级课程’ 的记录的 ID 值再根据 ID 值关联到 test1 再判断 test1 里面 name的值是否等于 zhangwei。 这两种执行方法的逻辑结果是一样的但是执行的效率会有不同而优化器的作用就是决定选择使用哪一个方案。优化器阶段完成后这个语句的执行方案就确定下来了然后进入执行器阶段 执行器
在执行之前需要判断该用户是否 具备权限 。如果没有就会返回权限错误。如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本如果设置了查询缓存这时会将查询结果进行缓存
select * from test where id 1;调用 InnoDB 引擎接口取这个表的第一行判断 ID 值是不是1如果不是则跳过如果是则将这行存在结果集中 调用引擎接口取“下一行重复相同的判断逻辑直到取到这个表的最后一行。 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。 SQL语句在mysql中的流程是sql语句-查询缓存-解析器-优化器-执行器