MySQL实战45讲学习:01 | 基础架构:一条SQL查询语句是如何执行的?

1.MySQL语句在各个模块中的执行过程
Mysql模块

2.逐步分析各个模块的作用。
连接器:验证连接者权限。
查询缓存:权限通过后首先查询缓存。建议不使用查询缓存,mysql 8.0之后已经关闭了查询缓存功能。原因:查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。所以查询缓存只适合静态不更新的表。
分析器:分析器如果没有命中查询缓存,就要开始真正执行语句了。分析器先会做“词法分析”,即是否有错误:You have an error in your SQL syntax
优化器:经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。如,优化器选择如何使用索引。
执行器: 执行器首先判断你有没有执行sql的权限,然后调用存储引擎,如,我们目前最多使用的innoDB引擎。

课后思考题:
如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?
课后答案:分析器。Oracle和MySQL会在分析阶段判断语句是否正确,表是否存在,列是否存在等。

问题:为什么对权限的检查不在优化器之前做?
回答:有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段(过程中)才能确定。优化器阶段前是无能为力的。

其它总结:
1,连接
连接管理模块,接收请求;连接进程和用户模块,通过,连接线程和客户端对接
2,查询
查询缓存 Query Cache
分析器,内建解析树,对其语法检查,先from,再on,再join,再where……;检查权限,生成新的解析树,语义检查(没有字段k在这里)等
优化器,将前面解析树转换成执行计划,并进行评估最优
执行器,获取锁,打开表,通过meta数据,获取数据
3,返回结果
返回给连接进程和用户模块,然后清理,等待新的请求

发表评论

邮箱地址不会被公开。