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。如果你有闲暇时间,可以做个知识拓展。
看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~