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进行筛选),最终将结果集返回到客户端。
优化器——>执行器:表权限校验、调度接口
根据查询条件去查询数据,如果有索引则走索引树,无则走全表扫描,将一条条数据加入数据集