如果你有疑问,一条查询SQL语句是如何在MySQL内部执行的? 相信看完这篇文章,你会有一个较为清晰的认识,先看下MySQL的基础架构图吧.
大体来说,MySQL可以分为Server层和存储引擎层两部分. Server层包括连接器,查询缓存,分析器,优化器,执⾏器等,涵盖 MySQL的⼤多数核⼼服务功能,以及所有的内置函数(如⽇期、时间、数学和加密函数等),所有跨存储引擎的功能都在这⼀层实现,⽐如存储过程,触发器,视图等.⽽存储引擎层负责数据的存储和提取.其架构模式是插件式的,⽀持InnoDB, MyISAM,Memory等多个存储引擎.
下面我们介绍下Server层的主要组成部分及功能:
一.连接器: 管理连接,权限校验
首先,我们会从客户端连接到数据库上,接待我们的就是连接器,连接器负责跟客户端建立连接,获取权限,维持和管理连接.连接分为长连接和短连接,短连接是指每次执行完很少的几次查询后就断开连接,它的问题在于建立连接的过程很复杂,性能很差,所以我们尽量使用长连接.而长连接也有特别占用内存的问题,此时有两种解决方案:1.定期断开长连接.2.如果是MySQL5.7或更高的版本,可以通过执行mysql_reset_connection来初始化连接资源,这个过程不需要重连及权限校验,但是会将连接恢复到刚创建时的状态.
二.查询缓存:命中直接返回结果
建立完连接,可以执行查询语句了,首先我们会先到查询缓存中看看,查询语句和结果会以key-value的形式存放在内存中,如果查询语句完全相同,就直接将value返回给客户端.如果语句不在查询缓存中,就会继续后面的执行阶段,并将执行结果放到查询缓存中.查询缓存和我们使用先查redis,再读库的方式非常像,但我们建议不要使用,因为往往弊大于利,只要我们对一张表有所更新,那么这张表的所有查询缓存都会被清空,所以查询缓存的命中率会非常低,并且在MySQL8.0版本中,已经直接将查询缓存的整块功能删除掉了.
三.分析器:词法分析和语法分析
如果没有命中缓存,那么就要对SQL语句进行解析了,MySQL会先做词法分析,识别出其中的关键字,表名,列名;然后MySQL再做语法分析,判断语法是否正确.
四.优化器:执行计划生成,索引选择
优化器在表里有多个索引的时候,可以决定使用哪一个,这样语句的执行方案就确定下来了,然后进入执行器阶段.
五.执行器:操作引擎,返回结果
开始执行的时候,会先判断客户端对这个表有没有查询权限,如果没有,返回错误;如果有,就打开表继续执行,并根据引擎定义去使用这个引擎提供的接口,例如调用InnoDB引擎查询数据,逐行比对是否满足条件,直到最后一行,将满足条件的记录作为结果集返回给客户端.