摘自:01 | 基础架构:一条SQL查询语句是如何执行的?-MySQL实战45讲-极客时间
视频讲解:7分钟精通MySql中SQL执行原理_哔哩哔哩_bilibili
可结合学习,本文仅记录SQL语句的执行流程,以上内容有一些额外知识未做记录。
SELECT * FROM Table1;
基础架构:一条sql查询语句的执行流程图
1. 连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接。要想执行SQL语句,首先要连接数据库,由客户端的连接驱动与数据库的连接池实现连接。
在完成TCP握手后,连接器需要验证你的身份(用户名和密码):
- 验证失败,返回"Access denied for user"错误,客户端程序结束执行;
- 验证成功,连接器会到权限表里面查出你拥有的权限。之后这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。
2. 查询缓存(MySQL8.0版本以完全删除)
可不看,MySQL8.0版本以完全删除该功能。为了序号与图示对应写一写。
过去执行过的SQL语句和它的结果以键值对的形式缓存在内存里。如果SQL语句能够在缓存中找到,直接返回它对应的value-结果;如果找不到,继续后续的操作。
缺点:
- 缓存查找慢
- 新建缓存消耗
- 批量失效(只要有对表的更新,与该表相关的所有语句都会失效,很频繁)
3. 解析器(词法分析、语法分析-SQL语句要做什么?)
-
词法分析:
通过sql/sql_lex.cc代码将SQL语句切分成各种token词。
通过定义了各种关键字和操作符的symbols[]数组进行关键词和非关键词的标记。
SELECT * FROM Table1;
将SELECT FROM识别为关键词
将* Table1识别为非关键词
-
语法分析:
bison语法分析器,通过sql/sql_yacc.cc规则代码将语句解析为“语法树”,判断你输入的这个SQL语句是否满足MySQL语法。
如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误。
4. 预处理器
对请求进行拆分。
先提交SQL模板语句,再提交参数执行。
对于多次重复执行的语句来说,提交一次模板即可,然后多次提交参数实现多次执行,提高效率。
此处会进行语法验证,表和列是否存在、别名歧义等。
5. 优化器(确定成本最小的执行计划-SQL语句要怎么做?)
基于成本的优化器CBO:从众多执行路径中选择一个成本最小的执行路径作为执行计划。
成本是指数据库的数据表、数据量、索引等信息算出SQL语句对应的IO成本和CPU成本。
6. 执行器
先验证有没有权限。
7. 存储引擎
Handler API
8. 返回处理结果
执行器通过TCP返回