01基础架构——一条sql执行时经历了什么笔记

MySQL执行的基础流程

author:陈镇坤27

创建时间:xx

编辑时间:2021年11月11日10:23:02、2021年11月28日23:05:38、2022年1月6日22:53:40


——————————————————————————————————————————

执行流程

在这里插入图片描述在这里插入图片描述

客户端——>连接器:建立连接,权限收集

1、问:连接分什么类型?

答:长期保持不断开,则是长连接,否则为短连接。

2、问:默认多久断开连接,参数如何设置?

答:配置为wait_time_out,默认8小时。

3、问:长连接会导致什么问题?

答:MySQL使用的临时内存管理在连接对象中,长期不释放将占用内存。

3、问:如何解决长连接问题?

答:1、定期断开;2、程序判断对象内存大,则断开,重新建立;3、5.7版本及以后,可以执行mysql_reset_connection初始化连接资源(此阶段不需要重连和权限收集)。

连接器——>查询缓存:查询语句是否命中缓存k值

1、问:命中缓存的判定逻辑是什么?

答:预编译语句是否命中KV缓存的k值,true则校验用户语句对应表权限,无碍则返回结果

2、问:为什么不建议使用查询缓存功能?

答:每次更新a表数据都会清光a表缓存,性能效率太差,甚至在8.0版本该功能被淘汰。

3、问:那在某些特定的场景有作用吗?

答:对于一些静态表而言,查询缓存是有作用的,在默认查询缓存关闭的情况下,在特定查询SQL中显式指定,以开启查询缓存

-- 查看查询缓存启用状态
show VARIABLES like '%query_cache_type%';
-- 显式指定sql语句启用查询缓存判断
 select SQL_CACHE * from T where ID=10;

查询缓存——>分析器:(库的权限校验)词法解析、语法解析

分析器——>优化器:选择索引

这里举例:

select * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

两张表使用join字段相连,此时由优化器决定谁是驱动表谁是被驱动表;

决定的根据:

不同表预估扫描的行数,排序或临时表开销等。

执行顺序:

优化器分析选择t1当驱动表和t2当驱动表的性能开销,觉得t1好,选择t1后,先根据t1.c=10搜索出对应的结果集数据,再作为条件到被驱动表进行筛选(用id筛选后再用t2.d为20进行筛选),最终将结果集返回到客户端。


优化器——>执行器:表权限校验、调度接口

根据查询条件去查询数据,如果有索引则走索引树,无则走全表扫描,将一条条数据加入数据集

执行器——>调用引擎API:提供读写接口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈镇坤27

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

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

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

打赏作者

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

抵扣说明:

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

余额充值