一条sql查询语句是如何执行的
整体结构
Mysql的架构图如下所示:
上图架构中的查询缓存,在myssql8.0及其以上版本已经被移除。
MySQL可以分为Server层和存储引擎层两部分。
Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了默认存储引擎。
连接器
连接器是负责客户端和MySQL进行连接的,在连接器这里会验证用户输入的账号和密码,以及对应的权限。
连接完成后,如果客户端太长时间没有动静,连接器就会将它断开。这个时间由wait_timeout控制,默认8小时。
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
分析器
这一步的主要工作就是检查sql语法是否正确。首先是词法分析,然后是语法分析。这一步也会检查这条sql的目的是什么。一般的语法错误,比如找不到一个字段,找不到某张表,都是这个阶段检测出来的。
优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。
执行器
执行阶段会先判断是否有权限,如果没有,则会返回错误。
比如下面的语句:
1 | select * from T where ID=10; |
如果id字段没有索引,那么大概的流程是下面的样子:
- 调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是则跳过,如果是则将这行存在结果集中;
- 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
- 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
参考
《MySQL45讲》