• 深入研究一下mysql


    一、应用架构演变

    1.1 V1.0单机单库

    瓶颈: 无法支撑大量数据,并发量也不高,如果挂了相关的所有服务全都死掉了。

    1.2 V2.0主从架构

    mysql相关架构有MHA、MGC、PXC
    瓶颈: 相比于1.0并没有提升数据量的存储性能,因为是多主的形式每一个库数据量都是相同的,为了保证一致性写操作还扩大了。

    1.3 V3.0分片

    alibaba mycat、当当网 sharding
    瓶颈: 复杂,要设计数据路由问题。保持数据一致性也是难题。

    1.4 V4.0云数据库

    使mysql编程一个saas(Software as a service)服务,服务提供配置性、扩展性、存储结构设计。

    二、架构体系

    2.1 网络连接层(Client Connectors)

    驱动例如java、JDBC

    2.2 核心服务层(MySQL Server)

    • 系统管理和控制工具:负责备份集群和安全
    • 连接池:管理连接提升处理效率
    • SQL接口:接收sql语句
    • 解析器:语法检查生成解析树
    • 查询优化器:优化并制定查询过程
    • 缓存:缓存

    2.3 存储引擎层(Pluggable Storage Engines)

    存储引擎层负责MySQL中数据的存储与提取,与底层系统文件进行交互。MySQL存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异 。现在有很多种存储引擎,各有各的特点,最常见的存储引擎是MyISAM和InnoDB。

    2.4 系统文件层(File System)

    系统文件层负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件、数据文件、配置文件、pid 文件、socket 文件等。

    2.5 日志系统

    主要作用是存储数据库的数据和产生的日志

    2.5.1日志

    • 错误日志(Error log)默认开启,show variables like ‘%log_error%’
    • 通用查询日志(General query log)记录一般查询语句,show variables like ‘%general%’
    • 二进制日志(binary log)记录了对MySQL数据库执行的更改操作,并且记录了语句的发生时间、执行时长;但是它不记录select、show等不修改数据库的SQL。主要用于数据库恢复和主从复制。 show variables like ‘%log_bin%’; //是否开启 show variables like ‘%binlog%’; //参数查看 show binary logs;//查看日志文件
    • 慢查询日志(Slow query log)记录所有执行时间超时的查询SQL,默认是10秒。show variables like ‘%slow_query%’; //是否开启show variables like ‘%long_query_time%’; //时长

    2.5.2 数据

    • db.opt 文件:记录这个库的默认使用的字符集和校验规则。
    • frm 文件:存储与表相关的元数据(meta)信息,包括表结构的定义信息等,每一张表都会有一个frm 文件。
    • MYD 文件:MyISAM 存储引擎专用,存放 MyISAM 表的数据(data),每一张表都会有一个 .MYD 文件。
    • MYI 文件:MyISAM 存储引擎专用,存放 MyISAM 表的索引相关信息,每一张 MyISAM 表对应一个 .MYI 文件。
    • ibd文件和 IBDATA 文件:存放 InnoDB 的数据文件(包括索引)。InnoDB 存储引擎有两种表空间方式:独享表空间和共享表空间。独享表空间使用 .ibd 文件来存放数据,且每一张 InnoDB 表对应一个 .ibd 文件。共享表空间使用 .ibdata 文件,所有表共同使用一个(或多个,自行配置).ibdata 文件。
    • ibdata1 文件:系统表空间数据文件,存储表元数据、Undo日志等 。
    • ib_logfile0、ib_logfile1 文件:Redo log 日志文件。

    三、Sql执行机制

    在这里插入图片描述

    • 1.建立连接
      MySQL客户端与服务器端基于通信协议建立连接,通信方式是 “ 半双工 ”。对于每一个 MySQL 的连接,时刻都有一个线程状态来标识这个连接正在做什么。
    • 2.查询缓存
      这是MySQL中可以优化查询的位置,如果开启了查询缓存且在查询缓存中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启查询缓存或者没有查询到完全相同的 SQL 语句,则执行后续过程,由解析器进行语法语义解析,并生成“解析树”
    • 3.解析器
      解析器负责将客户端发送的SQL进行语法解析,生成"解析树"。预处理器会根据MySQL规则进一步检查“解析树”是否合法,例如检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义,最后生成新的“解析树”。
    • 4.查询优化器
      查询优化器负责根据“解析树”生成最优的执行计划。MySQL有很多优化策略生成最优的执行计划,主要有两类:静态优化(编译时优化)、动态优化(运行时优化)。
    • 5查询执行引擎
      执行引擎负责执行“执行计划”,此时执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,会将SQL 语句和结果完整地保存到查询缓存中,后续若有相同的 SQL 语句,执行时则直接从缓存返回结果。

    参考

    https://mp.weixin.qq.com/s/ErSfjnXtk7Btp3ae6a-aVg
    外加两个公众号
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    10道小学趣味数学题
    HTML5期末考核大作业——学生网页设计作业源码HTML+CSS+JavaScript 中华美德6页面带音乐文化
    基于stm32单片机矿井瓦斯天然气温湿度检测报警系统
    【毕业设计源码】基于微信小程序的查寝系统的设计与实现
    C++PrimerPlus 第七章 函数-C++的编程模块-7.5 函数和C-风格字符串
    基于Vue+ELement搭建登陆注册页面实现后端交互
    微信小程序用户隐私API
    qlib的工作流管理:mlflow机器学习生命周期管理平台
    python高阶爬虫---视频类内容爬取(以BiliBili和城市影院为例说明)
    SpringCloud知多少
  • 原文地址:https://blog.csdn.net/zhaohan___/article/details/126604496