MySql查询语句执行流程
mysql整体架构示意图
mysql大体分为Server 层和存储引擎层两部分。
Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。
下面开始分析每个每个组件的作用。
连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。
查询缓存
建立完连接后就可以执行查询语句。
MySql收到执行语句会先查询缓存,如果命中缓存会将结果直接返回给客户端。
如果未命中会继续执行后续逻辑。如果命中缓存就不需执行后续逻辑查询效率会很高。
特别提示:
因为只要有对一个表的更新,这个表上所有的查询缓存都会被清空。查询缓存的失效非常频繁。所以不推荐使用查询缓存,除非特定表,如配置表等这种读多写少的表。
MySQL 8.0 版本直接将查询缓存的整块功能移除,也就是说 8.0 开始彻底没有这个功能了。
分析器
分析器先会做“词法分析”。将由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。
”词法分析”后会进行”语法分析”。语法分析会根据语法规则判断本次sql语句是否满足sql语法。如关键字拼写错误,表名是否存在等等。
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。
执行器
开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误.如果命中查询缓存,会在查询缓存返回结果的时候,做权限验证。查询也会在优化器之前调用 precheck 验证权限。
如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
总结
- 应用程序把通过数据库连接器建立连接后把SQL语句发送给服务端,这里会进行用户权限认证。
- 连接建立完成后,如果是MySQL8.0之前的版本并且打开了查询缓存,就会先去查询缓存。缓存命中直接返回结果,否则继续之后的步骤,并在之后把结果存入查询缓存。
- 分析器对SQL语句进行解析和预处理,并对SQL语句权限做precheck,生成解析树交给优化器。
- 优化器进行查询优化处理,获得执行计划,交给执行器。
- 执行器再次进行权限验证,之后调用存储引擎接口完成查询。
- 最后将查询结果返回客户端。