【重学MySQL】基础架构

笔记来自极客时间的MySQL45讲以及小林Coding

目录

 整体架构

Server层

连接器

使用长连接的局限性?

如何解决长连接出现的问题

查询缓存

解析器

预处理器

优化器

执行器

小问题

如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?


 整体架构

MySQL 可以分为 Server 层和存储引擎层两部分。

【重学MySQL】基础架构_第1张图片

Server 层负责建立连接、分析和执行 SQL。包括连接器、查询缓存、分析器、优化器、执行器等,还有一些内置函数和跨存储引擎的功能都在这实现,比如存储过程、触发器、视图等。
存储引擎层负责数据的存储和提取,架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等存储引擎。
不同的存储引擎共用一个Server 层,也就是从连接器到执行器的部分。

Server层

连接器

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

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

输入完密码之后会判断

  • 如果用户名或密码不对,会收到一个”Access denied for user”的错误,然后客户端程序结束执行。
  • 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

连接完成后,可以使用以下命令查看系统连接 

show processlist

【重学MySQL】基础架构_第2张图片

Command 列为“Sleep”就表示是一个空闲连接
长连接: 连接成功后,如果客户端持续有请求,则一直使用同一个连接
短连接:执行完很少的几次查询就断开连接,下次查询再重新建立一个 

使用长连接的局限性?

长连接累积下来,可能导致内存占用太大,oom,从现象看就是 MySQL 异常重启了。 

如何解决长连接出现的问题
  • 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,就断开连接
  • 在MySQL5.7及5.7之后,通过执行mysql_reset_connection来重新初始化连接。 

查询缓存

MySQL每次执行完一个查询请求后,会先到查询缓存里找。因为执行完查询操作的语句和结果会以 key-value 对的形式,被直接缓存在内存中。如果能在缓存里找到,就直接返回。
但是查询缓存非常容易失效,因为只要对表有更新操作,就会清空缓存,所以比较适合更新频率低的数据库。 

解析器

  1. 词法分析:识别sql语句的关键词
  2. 语法分析:根据词法分析的结果和语法规则判断是否符合sql语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取表名、字段名等 

预处理器

  1. 检查 SQL 查询语句中的表或者字段是否存在;
  2. 将 select * 中的 * 符号,扩展为表上的所有列 

优化器

确定SQL语句的最优的执行方案,比如表里面有多个索引的时候,优化器会基于查询成本的考虑,来决定选择使用哪个索引。 

执行器

  1. 调用 InnoDB 引擎接口取这个表的第一行,判断条件是否满足,如果不满足则跳过,如果满足则将这行存在结果集中;
  2. 调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
  3. 执行器将遍历过程中所有满足条件的行组成结果集返回给客户端。 

小问题

如果表 T 中没有字段 k,而你执行了这个语句 select * from T where k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

在预处理器阶段

 

你可能感兴趣的:(【重学MySQL】基础架构)