MySQL的SQL查询语句是怎么执行的
在MySQL里,一条查询语句,会经过:1
「连接器」->「分析器」->「优化器」->「执行器」
它们分别负责:
- 连接器:管理连接,权限验证
- 分析器:词法分析,语法分析
- 优化器:执行计划生成,索引选择
- 执行器:操作引擎,返回结果
上面四个构成了MySQL的Server层,Server层包括了大多数核心服务功能,以及所有内置函数,还有其他跨存储引擎的功能:比如存储过程、触发器、视图等,而执行器操作的,是Mysql的存储引擎层,它负责数据的存储和提取。
连接器
首先我们需要连接到数据库上,与数据库建立的是长连接,在连接断开之前,执行过程中产生的临时数据,都是保存在连接对象里的,所以会发现有些时候Mysql内存占用涨的比较快。可以考虑:
- 定期断开长连接
- 如果是使用Mysql 5.7或更高版本,可以在执行了比较大的操作之后,执行mysql_reset_connection来重新初始化连接资源
查询缓存
连接建立完成后,发送查询语句,执行洛溪首先会查询缓存,看是否命中缓存,如果命中,则直接返回缓存结果。
缓存在表进行更新的时候,会被清空,所以在大多数情况下,缓存的失效是很频繁的。
MySQL 8.0 版本已经将缓存模块移除。
分析器
如果没命中缓存,则开始执行语句。首先需要对SQL语句进行解析。
先做「词法分析」,识别出来字符串分别代表什么。
然后做「语法分析」,判断是否符合MySQL语法。
优化器
经过分析器后,MySQL知道语句想要做什么了,在具体执行前,会先经过优化器进行处理。
优化器可以在表有多个索引时,决定使用哪个索引;或有多个表join时,决定join的顺序。
执行器
执行时,会先查看是否有查询权限,如果有,则打开表继续执行。执行器调用引擎提供的接口:
- 调用引擎接口取第一行,判断是否符合条件,如果不是则跳过,如果是则将这行放入结果集;
- 调用引擎接口去下一行,重复相同判断逻辑,直到最后一行;
- 将结果集返回给客户端。
参考
「极客时间」-「MySQL实战45讲」
- 本文链接:https://keepmoving.ren/database/mysql/how-to-execute-select-sql/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!