学习《MySQL实战45讲》丁奇--第一篇 | 基础架构:一条SQL查询语句是如何执行的?总结
学习《MySQL实战45讲》丁奇--第一篇 | 基础架构:一条SQL查询语句是如何执行的?总结
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
1. MySQL的框架有几个组件, 各是什么作用?
说明:
MySQL可以分为 Server 层和存储引擎层两部分;
Server层:包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数;
1)连接器:连接器负责跟客户端建立连接、获取权限、维持和管理连接;
注:连接器判断用户通过后,是获取权限,而不是判断用户权限。
2)查询缓存:对执行过的sql语句及其结果可能(缓存开启)会以 key-value 对的形式保存在内存中,key是sql语句,value是查询结果;
注:只要有对一个表的更新,这个表上所有的查询缓存都会被清空;因此不建议在mysql8.0(不再有查询缓存)之前的版本中不建议使用mysql的查询缓存,除非某张表有很少的更新操作,可以将参数 query_cache_type设置成DEMAND,如果需要使用缓存可以显示的在SELECT语句后面使用SQL_CACHE开启当前sql语句的查询缓存功能。
3)分析器:对SQL语句做解析。主要是看sql语句中的字段是否合法以及对sql语法检测;
4)优化器:确定SQL语句的执行方案。决定使用哪个索引;决定各个表的连接顺序;
5)执行器:判断用户对SQL语句中涉及到的表有没有执行的权限,权限充分,执行引擎提供的接口,查询或更新数据,返回结果,(更新缓存),否则,返回权限不足的错误。
存储引擎层:负责数据的存储和提取。
2. 一个查询SQL语句执行的过程?
如上图所示:
1)通过连接器判断用户名和密码是否正确,若失败,直接返回用户被拒的错误;否则获取用户权限信息;
2)若查询缓存开启则通过sql语句查询缓存中是否有key为当前查询的sql,若存在,直接返回value,结束查询;
3)若缓存无结果返回,那么通过分析器,对sql语句进行解析,若sql语句有误,返回语法错误信息,结束查询;
4)sql语句正常经过分析器后,在优化器确认最终的执行方案,确定是用表中的索引以及表的连接顺序;
5)当到达执行器的时候判断用户对sql中的表有没有权限操作,若没有返回权限不足的错误信息,否则,调用存储引擎提供的数据查询接口查询数据,若缓存开启,则更新缓存,最后将结果返回。
3. you have an error in your SQL syntax 这个保存是在词法分析里还是在语法分析里报错?
应该是在词法分析时会报这个错,因为在词法分析时会匹配sql关键字和表名以及表结构字段。
4. 对于表的操作权限验证在哪里进行?
连接器获取用户权限,执行器判断用户权限。