• 我的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

  • 相关阅读:
    游戏的真实度
    91)Prometheus简单入门
    90)ubuntu 内核升级/降级系统内核(4.13.0)
    89)yaml文件语法
    使用格式工厂,把视频转为gif,画质受损,出现彩虹条模糊的情况
    fastadmin管理后台--带个人日程管理功能
    http响应--禁用缓存设置
    HTTP响应-302,304码的运用
    http请求详解 防盗链技术
    php支付宝支付接口开发(教程笔记)
  • 原文地址:https://www.cnblogs.com/inspred/p/11193803.html
Copyright © 2020-2023  润新知