Mysql的基础架构

mysql分为 server层 + 存储引擎层:

  • server层包括连接器、缓存、分析器、优化器、执行器等,以及所有的内置函数,还有存储过程,视图等跨存储引擎的功能。
  • 存储引擎层则负责数据的存储和提取,且存储引擎架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。其通过提供接口给server层,实现数据的增删改查。

Mysql的基础架构_第1张图片

要实现下面的sql查询,mysql各个组件操作流程是怎么样的呢?

select * from t_student where fname = 'jack';

首先客户端需要和mysql服务端建立连接,建立连接的过程如下:

Mysql的基础架构_第2张图片

注意事项:

  • 身份校验通过后,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑都将依赖于此时读到的权限。
  • show processlist 命令可以查看所有连接的状态(Command 列为 sleep 则是空闲 )
  • MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以长连接可能会有内存使用过大的风险,甚至会被强行kill掉。

然后进行sql查询,过程如下:

Mysql的基础架构_第3张图片

注意事项:

  • 只要对一个表做更新操作,这个表对应的所有的查询缓存都会被清空。所以使用缓存的前提是更新频率低,否则会影响性能。MySQL 8.0 版本直接将查询缓存的整块功能删掉了。
  • 对于我们这个例子,若fname没有建立索引,那么执行器会循环调用存储引擎接口,取出表中的每一行数据,并把 fname='jack' 的所有结果组装成集合返回给客户端
  • 在数据库的慢查询日志中有一个 rows_examined 的字段,执行器每次调用引擎获取数据行的时候,这个值就会累加。表示这个语句执行过程中扫描了多少行。注意,该字段并不代表存储引擎扫描行数,因为执行器调用一次接口,存储引擎可能扫描多行数据。

你可能感兴趣的:(Mysql)