通过了解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