假如你有一张表T,表里只有一个id字段,在执行下面这个查询语句,简述一下这条语句在MySQL内部的执行过程。
mysql > SELECT * FROM T WHERE id=10;
这是一张MySQL的基本架构示意图,通过图可以清晰的看到SQL语句在MySQL的各个模块中的执行过程。
- 大体来说,MySQL可以分为Server层和存储引擎层两部分。
- Server层包括连接器、查询缓存、分析器、优化器、执行器等核心服务功能,以及所有内置函数,比如日期、时间和加密函数等;所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
- 存储引擎层负责数据的存储和提取,其架构模式是插件式,支持InnoDB、MyISAM、Memory等多个存储引擎,其中InnoDB是最常用的存储引擎,从MySQL 5.5.5版本开始成为默认引擎。
- 连接器负责与客户端建立连接、获取权限、维持和管理连接。
- 连接命令包括用户名、密码等认证信息。
- 连接成功后,权限判断逻辑依赖于此时读到的权限,即使后续权限被修改,已建立的连接权限不变。
Q:在使用中减少连接动作尽量使用长连接,但全部使用长连接后,有些时候MySQL占用内存涨的特别快?
- 查询缓存用于存储之前执行过的语句及其结果,以提高查询效率。
- 但由于查询缓存的频繁失效和命中率低,大多数情况下建议不使用查询缓存。
- MySQL 8.0版本中,查询缓存功能被完全移除。
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。
mysql> SELECT SQL_CACHE * FROM T WHERE id=10;
- 分析器对SQL语句进行词法分析和语法分析,识别语句中的字符串和语法规则。
- 如果SQL语句有语法错误,会提示错误信息。
词法分析,识别出SQL语句各个字符分别是什么代表什么,比如把字符串T识别成表T,把字符串id识别成列ID。
语法分析,根据词法分析的结果,语法分析器再根据语法规则,判断输入的SQL语句是否满足MySQL语法。
- 优化器决定使用哪个索引或表的连接顺序,以提高执行效率。
- 优化器的选择可能影响查询性能。
mysql> SELECT * FROM t1 JOIN t2 USING(id) WHERE t1.c=10 AND t2.d=20;
既可以先从表 t1 里面取出 c=10 的记录的 ID 值,再根据 ID 值关联到表 t2,再判断 t2 里面 d 的值是否等于 20。
也可以先从表 t2 里面取出 d=20 的记录的 ID 值,再根据 ID 值关联到 t1,再判断 t1 里面 c 的值是否等于 10。
优化器的作用就是决定选择哪种方案,以便达到最佳效率。
- 执行器根据分析器和优化器的结果执行SQL语句。
- 执行过程中,会检查权限,并根据表的存储引擎使用相应的接口。
- 对于没有索引的表,执行器会遍历表中的每一行来查找满足条件的数据。