我的DBA之路:MYSQL架构

通过了解MYSQL架构,对MYSQL有一个整体的认识。

一,Mysql逻辑架构

1,逻辑架构图

Mysql也是模块化设计,总体分为两大块。服务和引擎是分离的(采用插件式的设计)

1.1,服务器(Server)层:

  大部分的服务都在这一层:包括查询解析,分析,优化,缓存,内置函数,存储过程,触发器,视图等。

1.2,存储引擎层

  存储引擎层负责数据的存储和提取,支持InnoDB,MyISAM,Memory等存储引擎。不同的存储引擎公用同一个Service层。服务器通过API和存储引擎通信,

不同的存储引擎之间不会通信。注意:存储引擎是不会解析SQL的。

二,MYSQL的各个组件

1,连接器

1.1,要使用数据库,第一步就是要连接到数据库上,执行: mysql -h $ip -p$port -u $root -p

这时候连接器负责处理这个请求,连接器负责和客户端建立连接,获取权限,维持连接,管理连接。

1.2,如果客户端太长时间没动静,连接器会自动断开这个连接。这个时间可以通过参数 wait_timeout控制,默认8小时。

通过mysql命令查询当前数据的所有连接信息:

其中的Time列,就是显示了该连接保持了多长时间。Command列显示了每个连接的状态,Sleep表示这个连接处于空闲状态

1.3,数据库中的长连接,短连接

长连接:连接成功后,如果客户端持续有请求,就一直使用同一个连接

短连接:每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

由于建立连接的过程比较复杂,建议尽量使用长连接。

1.4,生产条件下的问题:在全部使用长连接后,Mysql占用的内存涨的非常快?

原因分析:Mysql在执行过程中临时使用的内存是由连接对象管理的,这些资源在连接断开的时候释放,长连接积累下来,可能导致内存占用过大,

  被系统强行杀掉(OOM),就会出现Mysql异常重启。

解决办法:

方式一:定时断开长连接,使用一段时间,断开连接,之后查询再重连

方式二:Mysql5.7之后,每次执行完一个比较大的操作后,执行mysql_reset_connection来重新初始化连接。他会把连接恢复到刚刚创建的状态。

    这个过程不需要重新连接和做权限验证。

2,查询缓存

2.1,Mysql拿到一个查询请求后,会先到查询缓存查看,之前是不是执行过这条语句。

之前执行过的语句和结果会以 key(查询语句)-value(查询结果)对的形式,被直接缓存在内存中。

如果语句不在查询缓存中,会执行后面的步骤。执行完成后,再把结果存入查询缓存中。如果命中缓存,就会提高查询效率

2.2,但是,查询缓存的弊大于利

因为查询缓存的失效非常频繁。只要有对表的更新,这个表上的所有查询缓存都会被清空。对于频繁更新的表,查询缓存的命中率非常低。

2.3,如何设置是否启用查询缓存

query_cache_type = DEMAND ---->这样sql语句就不适用查询缓存了

还可以显示使用查询缓存:Select SQL_CACHE * from T where ID = 10;

3,分析器

如果没有命中查询缓存,就要开始真正执行语句了

1,分析器首先做 词法分析。

从你输入的sql语句中,识别出来 select关键字,表示这是一个查询语句,把字符串 T识别成表名,再把字符串 ID 识别成 列ID。经过分析器,mysql就知道你要干什么了。

2,然后做 语法分析。

语法分析器会根据规则,判断sql语句是否满足sql语法。如果错误,会返回:You have an error in your SQL syntax。

4,优化器

当表里有多个索引的时候,优化器决定使用那个索引。

当一个语句有多个表关联时,优化器决定各个表的连接顺序。

优化器阶段完成后,这个语句的执行方案就确定了。

5,执行器

这时候开始执行语句

1,开始执行的时候,先判断你对这个表T是否有查询的权限

如果没有返回权限错误,错误信息: select command denied to user ‘b’@’localhost’ for table ‘T’。

如果有权限,打开表继续执行,然后根据表的引擎定义,去使用这个引擎提供的接口。

2,执行流程

2.1,调用InnoDB引擎接口取这个表的第一行,判断ID值是不是10,如果不是就跳过,如果是就把这行存在结果集中;

2.2,调用引擎接口取 下一行,重复上面的判断逻辑,直到取到这个表的最后一行。

2.3,执行器把遍历过程中满足条件的行,组成结果集,返回给客户端。

三,Mysql物理存储架构

1,一个数据库对应一个文件夹,一张表对应一组文件

2, datadir:存储数据二进制文件的路径

3,表结构的组成

frm:表结构定义文件

MYI:索引文件

MYD:数据文件

4,shell>mysqlfrm  --diagnostic /data/mysql_data/aaa/.a.frm:可以把frm文件转成create table语句。(需要安装mysqlfrm)

四,查看自己服务器上的数据库结构:

1,比如我刚安装好的Mysql5.7数据库,里面有一个mysql库

2,进入data目录,查看mysql库中与表相关的文件,比如db表。

 3,注意:表的文件和存储引擎有关系,我们这里说的db表的存储引擎是MyISAM

 

posted @ 2019-07-16 11:30  inspire0x001  阅读(630)  评论(0编辑  收藏  举报