01 - 一条SQL查询语句是如何执行的?

文章的内容,我是从极客时间里面的MySQL45讲里总结的.如果大家想更具体的了解 大家可以去那里购买并学习

言归正传,一条SQL语句的执行,我们不从内部去看是不知道它具体是怎么执行的 首先,我们先看看MySQL的基本架构,它分为:

  • 客户端
  • 客户端就不多说了
  • server层

    • 连接器

    • 分析器

    • 优化器

    • 执行器

  • 存储层

  • 存储引擎

首先,我们先从server层开始说起 server层里面涵盖了MySQL的大多数服务,比如说内置函数(日期,时间等等),所有跨存储引擎的功能都在这里,比如存储过程,触发器,视图等

而存储引擎层负责数据的存储和读取,其架构模式是插件式的,支持innodb,myisam等多个存储引擎,现在最常用的应该是innodb了.

连接器

什么是连接器?它的作用就是负责客户端建立连接、获取权限、维持和管理连接.登录命令一般是:

mysql -h$ip -P$port -u$user -p

输入完命令后,连接器就开始对你的输入进行账户验证,权限验证.如果长时间不动的话,连接器就会自动把它断开,这个时间是由wait_timeout参数来控制,默认时长8小时

查询缓存

为什么基本架构部分没有把查询缓存加进去呢?是因为查询缓存将在MySQL8.0里面移除,为什么要移除呢?因为我们的数据经常在更新,这样的话,这个缓存就会失效,就要重新缓存,这样就没多大意义了

分析器

分析器会做什么呢?分析器主要做的是对你输入的SQL语句进行识别

  1. 先做词法分析,看看你这语句是要查还是更新?
  2. 语法分析,看看你的语法是否正确

优化器

优化器的东西就重要得多了,在这里会选择什么索引,是怎么选择索引的等等

执行器

顾名思义就是执行SQL语句了,在执行前会判断你对这个表有没有查询权限,如果没有则会报错,提示deined这样类型的错误

SELECT * FROM T WHERE ID = 10;

假设有一个表T,ID字段没有索引,那么执行器的流程如下:

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是等于10.不是则跳过.是就将这行存在结果集
  2. 调用引擎接口取'下一行',重复判断逻辑,直到这个表的最后一行
  3. 执行器将上诉遍历过程中的所有满足条件的行组成记录集作为结果集返回给客户端

至此,语句执行完毕

有索引的表执行逻辑差不多,第一次调用的是“取满足条件的第一行”这个接口,之后循环取"满足条件的下一行"接口,这些接口都是在引擎定义好的

标签:
作者:华传财
舞台上有你,就演好角色; 舞台上没你,就静静地做观众;

已有 0 位网友参与,快来吐槽:

发表评论