MySQL基础篇之基础架构

1. 基础架构:一条SQL查询语句是如何执行的?

1.1 总体架构

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

1.1.1 架构图

image

1.1.2 Server层

Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

1.1.2.1 连接器

1.1.2.1.1 作用

连接器负责跟客户端建立连接、获取权限、维持和管理连接

1.1.2.1.1.1 命令
  • 连接:\connect root@localhost:3306
  • 查看连接:show processlist;
1.1.2.1.2 长连接
1.1.2.1.2.1 定义

长链接在运行完持续请求后不断开

1.1.2.1.2.2 问题

但是全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

1.1.2.1.2.3 解决
  • 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
  • 如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
1.1.2.1.3 短连接
1.1.2.1.3.1 定义

短链接是运行完请求后断开

1.1.2.2 查询缓存

1.1.2.2.1 定义

命中缓存就直接返回

1.1.2.2.2 实现

之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

1.1.2.2.3 不建议使用

查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。

1.1.2.2.4 按需使用
1.1.2.2.4.1 使用

将参数query_cache_type设置成DEMAND,对于确定要使用查询缓存的语句,可以用SQL_CACHE显示指定

1.1.2.2.4.2 实际例子
mysql> select SQL_CACHE * from T where ID=10;

1.1.2.3 分析器

1.1.2.3.1 定义

对语句进行分析

1.1.2.3.2 词法分析

识别出关键字'select'、表名、列

1.1.2.3.3 语法分析

根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法

1.1.2.3.4 报错

如果你的语句不对,就会收到错误提醒。

1.1.2.3.4.1 信息

You have an error in your SQL syntax

1.1.2.3.4.2 重点关注

紧接'use near'的内容

1.1.2.4 优化器

1.1.2.4.1 定义

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

1.1.2.5 执行器

1.1.2.5.1 定义

操作引擎,返回结果

1.1.2.5.2 验证权限

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误

1.1.2.5.3 执行过程

例如有一条语句如下:

select * from T where ID=10;
  • 调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;
  • 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  • 执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
1.1.2.5.4 慢查询
1.1.2.5.5 查看日志

你会在数据库的慢查询日志中看到一个 rows_examined 的字段,表示这个语句执行过程中扫描了多少行。这个值就是在执行器每次调用引擎获取数据行的时候累加的。

参考资料

  1. 《MySQL实战45讲》

你可能感兴趣的:(MySQL基础篇之基础架构)