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语句!