写点什么

深度好文:MySQL 体系结构

  • 2024-01-16
    福建
  • 本文字数:2335 字

    阅读完需:约 8 分钟

MySQL 采用的是客户/服务器体系结构,实际是有两个程序,一个是 MySQL 服务器程序,指的是 mysqld 程序,运行在存放数据库的机器上,负责在网络上监听并处理来自客户的服务请求,根据这些请求去访问数据库的内容,再把信息回传给客户;另一个程序时 MySQL 客户程序,负责连接到数据库服务器,并通过向服务器发出查询命令来告知服务器需要哪些信息

MySQL 总体结构分为四层

<!-- more -->

组件说明

连接层

Connectors

指的是不同语言中与 SQL 的交互

服务层

Management Serveices & Utilities

系统管理和控制工具

Connection Pool

连接池,管理缓冲用户连接,线程处理等需要缓存的需求。 负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。

而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

SQL Interface

接受用户的 SQL 命令,并且返回用户需要查询的结果。比如 select from 就是调用 SQL Interface

Parser

解析器,SQL 命令传递到解析器的时候会被解析器验证和解析。解析器是由 Lex 和 YACC 实现的,是一个很长的脚本。

在 MySQL 中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。 主要功能:

  • 将 SQL 语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后 SQL 语句的传递和处理就是基于这个结构的。

  • 如果在分解构成中遇到错误,那么就说明这个 sql 语句是不合理的

Optimizer

查询优化器,SQL 语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql 语句) ,根据客户端请求的 query 语句,区分出是 select 语句转发给 Optimizer,优化处理掉一些常量表达式的预算,直接转换为常量值。并对 Query 中的查询条件进行简化和转换,如去掉一些无用或者显而易见的条件,结构调整等,然后分析 Query 中的 Hint 信息,看显示 Hint 信息是否可以完全确定该 Query 的执行计划,如果没有 Hint 或者 Hint 信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query 进行写相应的计算分析,然后得出最后的执行计划。

他使用的是“选取-投影-联接”策略进行查询。

   用一个例子就可以理解: select uid,name from user where gender = 1;   这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤   这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤   将这两个查询条件联接起来生成最终查询结果

复制代码

Cache 和 Buffer

查询缓存,主要功能是将客户端提交给 MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该 query 的 Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等

buffer 是写缓存,cache 是读缓存

插件式存储引擎层 Engine

存储引擎接口模块,MySQL 区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL 插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如 SQL 分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。

存储引擎是基于表的,而不是数据库。

交互过程

程序的请求通过 mysql 的 connectors 与其进行交互,请求会进入连接池(Connection Pool)中并交给管理器(Management Serveices & Utilities)管理,当该请求从等待队列进入到处理队列,管理器会将请求丢给 SQL 接口(SQL Interface),SQL 接口接收到请求后,会将请求进行 hash 处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则将由 SQL 接口传给解释器(Parser),解释器会判断 SQL 语句是否正确,如果正确则将 SQL 语句转化为数据结构,解释器处理完,则将数据结构传给优化器(Optimizer),优化器会产生多种执行计划,会根据该 sql 所涉及到的数据表的相关统计信息进行计算分析(这个统计数据是使用 ANALYZE table 表名命令通知 mysql 对表的相关数据做分析之后所获得的一些数据统计量),最终数据库会选择最优的方案将 SQL 语句交给存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并返回给程序


技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

用户头像

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
深度好文:MySQL体系结构_伤感汤姆布利柏_InfoQ写作社区