01|基础结构:一条sql查询语句是如何执行的?

目录

思维导图:

一.server层

1.连接器

(1)登录命令

(2)链接完成

(3)长连接与短连接

2.查询缓存

3.分析器

4.优化器

5.执行器

二.存储引擎

三.问题


思维导图:

01|基础结构 一条sql查询语句是如何执行的? | 八九. | 思维导图(新) | ProcessOn

密码:oHBW

一.server层

server主要包括连接器,查询缓存,分析器,优化器,执行器等,以及所有的内置函数,
所有的跨存储引擎功能都在这一层实现,比如存储过程,触发器,视图等

1.连接器

使用数据库第一步会连接到这个数据库,
连接器负责和客户端建立连接,获取权限,维持和管理链接

(1)登录命令

mysql -h$ip -P$prot -u$user -p 
用户名和密码不对,就会收到一个'Access denied for user'的错误,然后客户端程序结束执行
用户名和密码正确,就会根据链接里面的权限判断逻辑,依赖于此时读到的权限

(2)链接完成

连接完成,没有后续的动作,就会处于空闲状态,根据命令‘show processlist’显示的command看到他的状态,sleep为睡眠状态,query为查询状态等
客户端太长时间没有动静,就会自动断开连接,默认时间为8个小时

(3)长连接与短连接

长连接:连接成功后,客户端持续友情,则一直使用同一个请求
短链接:每次执行完几次查询就会断开连接,下次查询再重新建立一个
建立连接的过程复杂,所以要减少建立连接的动作,尽量使用长连接

长连接也有弊端:mysql在执行过程中临时使用的内存管理是连接对象里面的,
这些连接会在连接断开时候才释放,如果长时间积累下来,就会导致内存占用太大,
被系统强行杀掉,会导致mysql异常重启

解决方案
1.定期断开长连接,程序里面判断执行过一个占用内存大的查询后,断开连接,要查询再重新连接
2.用mysql5.7或更高版本,执行一个大的操作后,会自动执行mysql_reset_connection来重新初始化连接资源,将连接资源会断哦刚刚创建时的状态,这个过程不需要权限认证

2.查询缓存

mysql拿到一个查询请求后,回到查询缓存看一下,根据之前执行过的查询语句,是根据key-value对的形式存储的,key是语句,value是查询的结果
如果缓存中没有,会把查询中的结果放到查询缓存中,以便下一次查询的使用
但是不建议用查询缓存,mysql8之后也没有查询缓存
因为更新表会清空,这不是影响运行了吗,除非有一张静态表格

3.分析器

如果没有命中查询缓存,就要开始执行真正的执行语句了,就是对sql语句的解析
语法分析:判断你写的sql是否正确

4.优化器

表中存在多个索引的时候,决定使用哪个索引;
多表join时候,决定各个表的执行顺序,就是where关联多个条件(有and),先查询那个条件,先查询的条件不同,效率也不同

5.执行器

执行查询权限之前,会判断是否有这个表的查询权限
执行流程:
1.调用引擎接口去拿第一行数据,判断条件是否成立,不成立就跳过,成立就把这条结果放到结果集中
2.反复执行,直到最后一行
3.执行器将上述遍历的结果集给客户端,查询结束
查询日志中有一个rows_examined的字段,表示这个语句执行过程中扫描了多少行

二.存储引擎

存储引擎负责数据的存储和提起,架构模式是插件式的,支持八种存储引擎,默认的是InnoDB,
是唯一一个支持事务的引擎, 不同的存储引擎共用一个Server层(后面的章节会说明)

三.问题

如果表中不存在我们需要查询的字段,
这个错误是在那个阶段报出来的呢?

分析器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腊Rou单车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值