Mysql的深入浅出—— 一条sql是如何执行的?

mysql> select * from T where ID=10;

我们往往知道sql语句怎么写,但是从未了解它的一个内部执行过程是什么!
在这里插入图片描述
总体分为两部分 server+存储引擎 两部分。

不难看出不同的存储引擎(innodb、myism)共用的都是一套server。

连接器
很容易理解,与mysql服务端建立连接:

mysql -h$ip -P$root -u$user -p

数据库里存在长连接和短连接,长连接是指和客户端保持连接,一直使用同一个连接,短连接则是每次执行完几次查询后断开,下次查询则需重新创建,而在建立连接的过程是比较消耗性能的,推荐使用长连接,但是如果我们的连接都是长连接则会有个问题,就是mysql的内存飙升,长时间累积造成OOM,mysql服务挂掉,怎么解决呢?

1⃣️ 定期去断开长连接,使用一段时间,在程序里判断一下执行过占用内存较高的查询后,断开连接,之后再重连;
2⃣️ 针对mysql5.7及以上版本,可以在执行一次比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。

查询缓存
建立完连接,执行select的时候,会先到查询缓存里看看之前是不是执行过这个语句,之前执行过的语句会以k-v的形式存到内存里,key:查询语句,value:查询的结果,如果找到缓存,则返回对应的value,提高查询效率。
⚠️ 在工作中尽量避免使用查询缓存,因为查询缓存的失效非常频繁,往往一个更新语句则会导致整张表的查询缓存被清空,因此很可能你费劲把结果缓存起来,还没用就已经失效了。
对于你要使用的查询缓存的sql,你可以通过SQL_CACHE显示去指定:

mysql> select SQL_CACHE * from T where id=10;

分析器
当查询缓存没有命中的时候,分析器就上场了,mysql也需要知道你写的sql是要干一件什么事情,对sql语句做解析。
eg:select * from T
它会做语义分析,比如from后面跟的是表名。

优化器
当mysql分析语义后就知道你要干什么事了,在开始执行前,还需要优化器的处理,优化器你可以理解比如表里有多个索引的时候,决定使用哪个索引;或者join连接多张表的时候,表的连接顺序,优化器去决定选用那种方案。

执行器
执行sql语句!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值