Mysql成长系列之一:Mysql的基础架构

本文是Mysql成长系列的第一篇,主要简单概述Mysql的内部基础架构,并且会以一些简单的例子辅佐阐述。
OK,首先先上Mysql数据库内部的基本结构图:
在这里插入图片描述

Mysql数据库总体来说分为Server层存储引擎
Server层主要包括连接器查询缓存分析器优化器执行器等,涵盖了Mysql的大部分功能,主要负责与客户端对接,接收外部命令,并对命令进行分析优化等等操作,最后对存储引擎发出读写操作,返回结果给客户端。
存储引擎是Mysql数据库的数据存储部分,负责数据的存储和提取。支持InnoDB,MyISAM,Memory等存储引擎,目前的主流以及默认存储引擎是InnoDB

Server层

一、连接器

连接器是Mysql内部结构的最外层,即与外界客户端(客户端有很多种,只要能实现对接Mysql接口的程序都可称为客户端,例如Navicat。cmd命令也属于客户端)所关联的接口,所以连接器就是Mysql暴露在外的唯一接口,所有对Mysql的操作都会经由此接口。连接器负责与客户端建立连接、获取权限、维持和管理连接
连接命令的一般格式为:

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

$ip为Mysql所在服务器的IP地址(本机为localhost)
$port为Mysql占用的服务器端口(一般为3306)
$user为用户账户

输入此命令后,系统会提示输入密码(隐式,虽然密码可以直接写在-p后,但是明文密码不安全,不建议)。密码输入结束后,客户端就会与Mysql服务器(的连接器)建立连接(TCP,根据ip和port),连接成功后,连接器会进行权限验证(根据账户和密码)。
(1)如果账户或者密码不正确,那么Mysql数据库会返回Access denied for user错误。
(2)如果验证通过,连接器就会从权限表查询此用户所拥有的的权限,并且,在这次连接上的每次操作的权限判断,都是基于此权限,而不是每次都要去权限表查询(这意味着,假如本次连接还在使用时,假如有其他管理员修改了此用户的权限,并不会影响这次连接)。

此时,连接已经建立完成,那么用户就可以在此连接上进行一系列增删改查的操作了。此时需要注意,连接长时间不使用时,会自动断开连接,自动断开的时间参数(time_timeout)是可以设置的。

数据库的连接分为长连接短连接
(1)长连接是指客户端的多次请求都是使用的同一连接。
(2)短连接是指较少的请求就断开连接,之后再连接进行请求,连接较频繁。

由于连接的建立较为复杂,所以更建议使用长连接,但是长连接有一个缺点就是当一个连接长期使用不释放时会导致Mysql占用内存越来越大,甚至可能会报OOM异常。所以建议定期断开长连接

二、查询缓存

连接建立完成后,就可以使用数据库的增删改查等命令了。Mysql针对查询命令设有查询缓存,用于缓存查询结果,优化查询结果。例如现在客户端发出一条select语句,那么程序会先到缓存中查询是否有查询结果,如果有,那么数据库会直接返回缓存结果,如果缓存中没有,那么程序会转而向数据库中查询
这里需要注意的是,缓存的存储形式是KEY-VALUE形式的数据结构。KEY是完整的SQL语句,VALUE是SQL语句在数据库的查询结果
但是,由于每次更新(update)语句都会使一些缓存失效,所以缓存命中率较低,渐渐被淘汰,在Mysql8.0版本彻底被淘汰。

三、分析器

如果没有设置缓存或者缓存没有对应数据项,那么Mysql程序就要根据SQL语句从数据库中查询数据了。因为Mysql的命令是有严格规范的,所以每一个SQL命令Mysql程序都会严格分析检查命令语句是否符合规范,那么这个功能就交由分析器负责。所以分析器的职责就是分析语句的合法性以及语句的语义
例如,分析器检查命令语句的第一个字母是select,那么分析器就会认定这是一条查询语句命令,那么接下来就会按照查询语句的规范对语句后面的内容进行检查和分析。假如命令语句的单词是elect等错误单词,那么分析器会返回语法错误。
另外不止这些,Mysql的Server层存储了所有表的基本信息(例如有哪些表,表里有哪些列,数据类型等等,数据较小,不涉及真实存储的数据),查询语句中涉及对指定表的操作,以及指定查询某一、某些列,并且可能使用了where条件,涉及对某一、某些列的判断。那么分析器也会判断数据库是否有指定表,是否有指定列等等
例如:select name from Student where age =10 查询语句
分析器会判断数据库中是否有Student表,Student表中是否含有name age 列。

在分析器分析完语句后,那么Mysql就确定用户的操作了,那么就可以交由下一步执行后续操作了。

四、优化器

在Mysql执行增删改查语句之前,会经由优化器优化。比如,Mysql对目的表的一些列加了索引(一种数据结构,一般对经常作为查询条件的列加索引),那么优化器会选择使用哪种索引。又或者当查询语句涉及两个表关联查询时,优化器会决定各个表的连接顺序。

五、执行器

经过前面层层的筛选,Mysql程序终于来到了执行器阶段,执行语句。
以查询操作为例:
开始执行时,程序会先判断权限,即用户是否有操作该表的权限,如果没有,返回没有权限,如果有权限,继续执行接下来的操作。(注:对缓存的查询也会先验证权限)。
权限验证完成后,执行器根据存引擎的定义,使用引擎接口,对表进行操作:
(1)如果没有索引,执行器调用引擎接口,查询表的第一行,是否符合查询条件,如果符合则将该列数据放入结果集。接下来向下继续查询。最后将最终查询的结果集返回给客户端
(2)如果有索引,执行器会根据从索引查出的结果到指定地址判断对应的每一行是否符合查询条件,如果符合也将放入结果集并返回客户端。

存储引擎

Mysql支持InnoDB,MyISAM,Memory等存储引擎。主流的存储引擎为InnoDB。存储引擎提供读写数据接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值