mysql的一个sql语句如何执行

0 mysql 逻辑架构图

大体来说,mysql可以分为Server层和存储引擎层两个大部分,其中Server
层包括连接器、查询缓存、分析器、优化器、执行器等。引擎层数据存储和提取,InnoDB支撑事务、外键、行锁等,MyISAM 插入数据快,空间和内存使用比较低。mysql 权限管控1.链接验证2.请求验证。
在这里插入图片描述

  • 连接器;管理连接,权限验证;show variables like ‘%max_connections%’; show processlist 可以查看连接状态等信息,客户端连接成功,如果超过一定时间(默认8小时)没有动静,连接器会自动将其断开。show variables like ‘%wait_timeout%’;

  • 分析器;语法分析、词法分析,知道sql要做什么,构建语法树。开源的插件有antlr、calcite。 如下图所示不存列会在分析阶段报出来。
    在这里插入图片描述

  • 优化器;执行计划生成,索引选择;优化器是在表里有多个索引或者一个语句有多表关联 join。常见优化器有:RBO(Rule-Based Optimization)和CBO(Cost-Based Optimization)。

  • 执行器;操作引擎,返回结果;mysql 通过分析器知道sql要做什,通过优化器知道怎么做,执行器

  • 查询缓存;一般不建议使用查询缓存;只要有对一个表更新;这个表上的所有查询缓存都会被清空。如果是静态表(几乎不更新)那这样才适合查询缓存。 show variables like ‘%query_cache_type%’;

1 一条查询如何执行

 select * from user where id=1;

第一步客户端要通过连接器连接上数数据库, mysql -h h o s t − P host -P hostPport -u$user -p
第二步查询缓存,如果缓存有数据就直接返回,mysql 8.0 以上的版本已经取消了。
第三步分析器,mysql 根据你输入通过词法分析识别出select 、where关键字和非关键字user和id等,接下来会进行语法分析,判店输入的这个SQL是否满足mysql语法,然后生成相应语法树,如果语法不对会报错。
第四步优化器,经过分析器之后,mysql知道了你要做什么,但是怎么做才能最优,会按照RBO和CBO进行优化。比如该用那个索引或者在一个语句有多表关联join的时候,决定各个表的链接顺序。
第五步执行器,通过分析器知道到要做什么,通过优化器知道了该怎么做。在执行器阶段就开始调用存储引擎的接口执行。上面这个查询语句中如果id没有锁引执行过程1)调用InnoDB引擎的接口读取这个表的第一行,判断Id是不是等于1,如果满足条件则放到结果集中,不满足条件的则跳过 2)读取下一行数据,重复1步骤,直到读取完所有数据 3)将上述遍历满足条件的所有数据的结果集返回给客户端。对于有索引的表,执行逻辑也类似。如果查询中遇到了慢查询可以查看mysql慢查询日志分析,慢查询介绍

2 一条更新的语句如何执行

update user set name="hscTest" where id=1;

更新流程如下图所示,采用两阶段提交来保证redo log 和binlog 逻辑上一致性。先看下怎么保障逻辑一致性的?有以下几种情况 1)阶段1 prepare redo log 已经写完,在写binlog 之前mysql进程异常退出或者写失败。由于此时 binlog 还没写,数据也不会传到备库,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚掉。2)阶段一和阶段二都已经完成,即prepare redo log 已经写完,binlog已经写完,还没有commit前发生crash。恢复时候如果redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交;如果redo log 里面的事务只有完整的 prepare,则判断对应的事务 binlog 是否存在并完整:如果都是完整的则提交事务否则回滚。
在这里插入图片描述

参考文献
[1]https://dev.mysql.com/doc/refman/8.0/en/access-control.html
[2] 高性能mysql 第三版
[3]极客时间mysql实战45讲

猜你喜欢

转载自blog.csdn.net/huangshanchun/article/details/111188385
今日推荐