在MySQL里,一条查询语句,会经过:

1
「连接器」->「分析器」->「优化器」->「执行器」

它们分别负责:

  • 连接器:管理连接,权限验证
  • 分析器:词法分析,语法分析
  • 优化器:执行计划生成,索引选择
  • 执行器:操作引擎,返回结果

上面四个构成了MySQL的Server层,Server层包括了大多数核心服务功能,以及所有内置函数,还有其他跨存储引擎的功能:比如存储过程、触发器、视图等,而执行器操作的,是Mysql的存储引擎层,它负责数据的存储和提取。

连接器

首先我们需要连接到数据库上,与数据库建立的是长连接,在连接断开之前,执行过程中产生的临时数据,都是保存在连接对象里的,所以会发现有些时候Mysql内存占用涨的比较快。可以考虑:

  1. 定期断开长连接
  2. 如果是使用Mysql 5.7或更高版本,可以在执行了比较大的操作之后,执行mysql_reset_connection来重新初始化连接资源

查询缓存

连接建立完成后,发送查询语句,执行洛溪首先会查询缓存,看是否命中缓存,如果命中,则直接返回缓存结果。
缓存在表进行更新的时候,会被清空,所以在大多数情况下,缓存的失效是很频繁的。
MySQL 8.0 版本已经将缓存模块移除。

分析器

如果没命中缓存,则开始执行语句。首先需要对SQL语句进行解析。
先做「词法分析」,识别出来字符串分别代表什么。
然后做「语法分析」,判断是否符合MySQL语法。

优化器

经过分析器后,MySQL知道语句想要做什么了,在具体执行前,会先经过优化器进行处理。

优化器可以在表有多个索引时,决定使用哪个索引;或有多个表join时,决定join的顺序。

执行器

执行时,会先查看是否有查询权限,如果有,则打开表继续执行。执行器调用引擎提供的接口:

  1. 调用引擎接口取第一行,判断是否符合条件,如果不是则跳过,如果是则将这行放入结果集;
  2. 调用引擎接口去下一行,重复相同判断逻辑,直到最后一行;
  3. 将结果集返回给客户端。

参考

「极客时间」-「MySQL实战45讲」