一、Mysql的逻辑架构图
一条SQL查询语句时如何执行的(一)_Mysql
大体上Mysql可分为Server层和存储引擎层两部分。

  • Server层:
    主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。
  • 存储引擎层
    主要负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

二、下面是各个组件的作用

  • 连接器
    这是连接到数据库上的第一关,用的是TCP方式,然后认证身份,接下来会查询连接用户的权限供当前Session使用。如果中途修改了用户权限,也会在新的连接session才会生效。
    连接完成后,没有后续动作,则该连接就会变成空闲连接。
    可以用show processlist看到:
mysql> show processlist;
+----+------+----------------+------+---------+------+-------+------------------+
| Id | User | Host           | db   | Command | Time | State | Info             |
+----+------+----------------+------+---------+------+-------+------------------+
|  3 | root | localhost:9885 | NULL | Query   |    0 | NULL  | show processlist |
|  4 | root | localhost:9908 | NULL | Sleep   |   46 |       | NULL             |
+----+------+----------------+------+---------+------+-------+------------------+
2 rows in set (0.00 sec)

其中的Command列显示为“Sleep”的这一行,就表示现在系统里面有一个空闲连接。

客户端如果长时间没活动,连接器就会将它自动断开,这个时间由wait_timeout控制的,默认值是8个小时。

  • 查询缓存
    连接建立完成后,执行查询语句,mysql会先在缓存中查找,之前执行过的语句及结果可能会在内存中以key-value对的形式缓存着,如果有则会直接返回结果。
    缓存的弊端就是只要表更新过,那么关于这个表的所有缓存就会被清空,如果表更新的比较频繁,反而会增加数据库压力,需要注意的是,Mysql 8.0版本直接将查询缓存的整块功能删除掉了。

  • 分析器
    mysql 将查询语句分析识别,此时发现语法有误就会报错。

  • 优化器
    在真正的SQL执行之前,还要经过优化器,决定该查询使用哪个索引,或者决定表的连接顺序等等

  • 执行器
    开始执行前,先判断一下对这个表有没有查询的权限,然后才开始查询。
    执行where条件查询时,如果该字段没有索引,就会逐条遍历。

---------------------------------------------------- 完----------------------------------------------------