侧边栏壁纸
博主头像
ProSayJ 博主等级

Talk is cheap. Show me the code.

  • 累计撰写 43 篇文章
  • 累计创建 16 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

02-为了执行SQL语句,MySQL做了哪些设计

YangJian
2025-06-11 / 0 评论 / 1 点赞 / 25 阅读 / 0 字

1. 应用程序通过数据库连接把预期执行的SQL发送给MySQL数据库




2. 网络连接是由MySQL 服务端的独立的线程来处理

一条SQL语句,谁负责从这个连接中去监听网络请求?谁负责从网络连接里把请求数据读取出来?




3. SQL接口:负责处理接收到的SQL语句

SQL接口 负责处理接收到的SQL语句,MySQL的工作线程接收到SQL语句之后,就会转交给SQL接口去执行


4. 查询解析器:让MySQL能看懂SQL语句

select id,name,age from users where id=1
这个查询解析器(Parser)就是负责对SQL语句进行解析的,比如对上面那个SQL语句进行一下拆解,拆解成以下几个部分:
1. 我们现在要从“users”表里查询数据
2. 查询“id”字段的值等于1的那行数据
3. 对查出来的那行数据要提取里面的“id,name,age”三个字段。

所谓的SQL解析,就是按照既定的SQL语法,对我们按照SQL语法规则编写的SQL语句进行解析,然后理解这个SQL语句要干什么事情


5. 查询优化器:选择最优的查询路径

当我们通过解析器理解了SQL语句要干什么之后,接着会找查询优化器(Optimizer)来选择一个最优的查询路径。


6. 调用存储引擎接口,真正执行SQL语句

真正在执行SQL语句的时候,要不然是更新数据,要不然是查询数据,那么数据存放在哪里?
说白了,数据库也不是什么神秘莫测的东西,你可以把他理解为本身就是一个类似你平时写的图书馆管理系统、电信计费系统、电商订单系统之类的系统罢了。
假设我们的数据有的存放在内存里,有的存放在磁盘文件里:
那么现在问题来了,我们已经知道一个SQL语句要如何执行了,但是我们现在怎么知道哪些数据在内存里?哪些数据在磁盘里?我们执行的时候是更新内存的数据?还是更新磁盘的数据?我们如果更新磁盘的数据,是先查询哪个磁盘文件,再更新哪个磁盘文件?所以这个时候就需要存储引擎了,存储引擎其实就是执行SQL语句的,他会按照一定的步骤去查询内存缓存数据,更新磁盘数据,查询磁盘数据,等等,执行诸如此类的一系列的操作。


7. 执行器: 根据执行计划调用存储引擎接口

存储引擎可以帮助我们去访问内存以及磁盘上的数据,那么是谁来调用存储引擎的接口呢?执行器!!
执行器会根据优化器选择的执行方案,去调用存储引擎的接口按照一定的顺序和步骤,就把SQL语句的逻辑给执行了。

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“users”表中的第一行数据,然后判断一下这个数据的“id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。

执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL语句的执行计划,大致就是不停的更新或者提取一些数据出来。

1

评论区