【MySQL】架构

1. MySQL架构基本理解

与餐厅就餐类比理解

  • 每次数据库查询就像一次餐厅服务
    • 应用程序发出查询相当于点菜
    • MySQL解析和执行查询,后厨根据订单制作食物
    • 事务管理保证数据的一致性,类似于结账的时候保证账单正确
    • 查询的时候考虑优化器,类似于厨师选择最快的炒菜方法

对应结构理解

 各个层级作用简单理解

连接层

  •  管理客户端的连接请求。负责身份验证线程复用连接限制、以及一些缓存管理。通过连接池,MySQL 可以高效地处理大量并发请求,减少频繁的连接创建和销毁的开销
  • 像餐厅的迎宾员,负责安排客人入座,分配资源

服务层

  • NoSQL Interface:支持 NoSQL 的 CRUD 操作(主要是简单的增删查改)。
  • SQL Interface处理 DML、DDL 语句,包括视图、存储过程和触发器。
  • Parser:将 SQL 语句解析成数据库可以理解的操作,检查语法和权限。
  • Optimizer:根据查询语句的结构,选择执行查询的最佳路径。
  • Caches & Buffers:提供全局缓存,以及针对不同存储引擎的缓存机制。
  • NoSQL 和 SQL 接口像服务员,将客户端的请求转换为具体的操作。
  • 解析器(Parser)和优化器(Optimizer)决定如何高效执行请求。
  • 缓存和缓冲区就像厨房准备的食材,减少重复操作,提高性能。

存储引擎层

  • InnoDB:支持事务、行级锁和外键约束,是 MySQL 默认存储引擎。
  • MyISAM:轻量级引擎,不支持事务,适用于读多写少的场景。
  • MEMORY:将数据存储在内存中,速度快但数据不持久。

文件系统层

  • 负责将数据以及日志文件存储在操作系统的文件系统上
  • 日志文件(如 redoundo、错误日志等)
  • 数据库数据文件二进制日志配置文件

缓存与缓冲区8.0以后不再使用

MySQL8.0移除了全局查询缓存,因为其会成为高并发环境下性能瓶颈,同时InnoDB提供了更加高效的缓存机制,现在基本都推荐使用应用层缓存(Redis类似)解决高并发缓存问题,MySQL则负责专注于数据存储和查询优化

2. 连接层

2.1 网络端口和连接管理线程

网络端口

MySQL本质上是网络服务,IP地址和端口号可以找到特定的进程,该进程上运行的就是MySQL服务

配置网络端口(通过配置文件生效也可以自己手动配置)

[mysqld]
port=3306
bind-address=0.0.0.0
//bind-address参数设置MySQL监听的IP地址,0.0.0.0表示允许所有IP访问
//限制特定IP访问时则可指定具体IP

连接管理线程

类似于主从Reactor模式中的主Reactor专门管理连接

  • MySQL连接管理类似于主从Reactor模式,主Reactor负责接收客户端的连接请求,然后分发给专门的连接线程处理。这样可以分担连接压力,提高响应效率

多线程的管理

  • 通过MySQL的多线程架构,主线程将连接分配给多个工作线程,提升并发处理能力。例如在InnoDB存储引擎中,后台线程池管理大量连接和事务

2.2 客户端连接线程管理

主从Reactor模式中,子Reactor在线程池中专门负责处理新连接任务,线程池实现了线程的复用,从而减少性能开销,提高其整体性能。 

在主从Reactor架构下,子Reactor线程池专门用于处理新的连接任务。线程池的复用和独立处理可减少主线程的性能开销,并在高并发场景下保持高效

2.3 连接量管理

最大连接数设置

  • 注意不要超过服务器的内存和CPU的承载能力,避免系统崩溃
SET GLOBAL max_connections = 200;

连接超时管理

  • 对于不活跃的连接,设置较短的超时时间,从而确保及时释放资源
SET GLOBAL wait_timeout = 28800;
SET GLOBAL interactive_timeout = 28800;

连接缓存

  • thread_cache_size控制连线程的缓存数量,较大的缓存可以减少线程频繁的创建和销毁

SSL/TLS加密管理

  • 服务端,开启并配置
//服务端 生成证书配置MySQL
[mysqld]
require_secure_transport=ON
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem

//客户端配置
mysql --ssl-ca=/path/to/ca.pem -h host -u user -p

3. 服务层

3.1 服务管理与公共组件

  • Backup & Recovery(备份与恢复)

    • 提供数据备份和恢复功能,用于在发生数据丢失或损坏时恢复数据,保障数据的持久性和完整性。
    • 通常包括逻辑备份(如mysqldump工具)和物理备份(如MySQL Enterprise Backup工具)
  • Security(安全)

    • 涉及MySQL的安全性管理,包括用户权限、身份验证、数据加密等方面
    • 通过用户管理、权限控制和SSL/TLS加密来保证数据库的安全访问
  • Replication(主从复制)

    • 支持主从复制(Master-Slave Replication)功能,将数据从一个主数据库同步到一个或多个从数据库,实现数据冗余和负载均衡
    • 适用于数据同步、读写分离和灾备等场景
  • Cluster(集群)

    • MySQL Cluster是一种高可用、分布式的数据库解决方案,支持无共享架构,适合需要高性能和高可用性的场景
    • 在多节点之间分布数据和负载,提供容错能力
  • Partitioning(表分区)

    • 支持表分区功能,将一张大表按某种分区规则(如范围、列表、哈希等)划分为多个分区,提升查询和管理的效率
    • 有助于管理大型数据集,优化查询性能
  • Instance Manager(实例管理)

    • 管理MySQL实例的启动、停止、配置等操作,支持多实例运行,便于资源隔离和管理
    • 通过命令行或图形化界面来控制和监控数据库实例
  • Administrator(管理员工具)

    • 提供MySQL的管理功能,包括用户管理、权限分配、配置修改、性能监控等
    • 可以通过MySQL Workbench等图形化工具或命令行工具实现,简化数据库管理流程
  • Migration Toolkit(迁移工具)

    • 用于将其他数据库系统(如Oracle、SQL Server)中的数据迁移到MySQL,支持数据和架构的迁移
    • 便于在不同数据库系统之间进行数据转换和整合

3.2 NoSQL接口与SQL接口

该接口的目的就是简化客户端和数据库的交互过程,从而确保SQL语句的高效执行和结果传递

  • 接收客户端请求
    • 接收客户端发送过来的SQL语句以及命令请求,该接口可以识别不同的请求
  • SQL转发与执行
    • 接收到SQL语句后,接口将其转发至MySQL的查询处理器或存储引擎等其他模块进行处理。
    • 根据请求类型,可能会交由不同的引擎(如InnoDB、MyISAM等)来执行
  • 结果返回
    • 执行完SQL语句后,接口将处理结果(如查询结果或操作状态)返回给客户端。
    • 这一过程确保客户端能够获得SQL命令执行的反馈,完成与数据库的交互

3.3 Parser-语法分析器

主要作用就是将客户端发送的SQL语句进行解析和转换

  • 词法分析
    • 解析器首先对SQL语句中的关键词(例如select)进行词法分析,将这些关键词与自定义字段提取出来
    • 词法分析将SQL语句分解成一个个基本单元,便于后续的语法分析
  • 语法分析
    • 在词法分析后,解析器会检查SQL语句的语法结构,判断其是否符合SQL标准语法
    • 如果语法正确,解析器会将SQL语句转换为解析树(Parse Tree),为执行引擎提供结构化的信息。如果语法不正确,则会返回错误
  • 生成解析树
    • 解析树是SQL语句的结构化表示,包含语句的操作类型(如SELECT)以及操作对象(如表和字段)
    • 解析树为后续的查询优化和执行提供了基础

3.4 Optimizer-查询优化器

查询优化器的目的就是在多种执行方案中寻找最佳方案,从而使得SQL查询的执行更加高效,其内部通过索引选择、连接优化、条件过滤和查询重写等手段实现该目标。目的就是提高其搜索性能

优化后的SQL语句在条件查询的时候可能与自己写的查询条件过滤顺序不同

3.5 Buffer-缓存

缓存机制可以显著提高查询性能,但在高写入频率的场景中会导致缓存失效频繁,反而影响效率。因此MySQL从5.6版本开始默认关闭查询缓存,并在8.0版本中完全移除。在现代应用中,推荐使用外部缓存来实现对高频查询的优化

缓存作用分析

当服务器接收到SELECT查询时,会先检查缓存中是否已存有该查询的结果。若缓存中存在相同的查询(使用键值对形式存储,key为查询SQL语句,value为结果集),则直接返回缓存的结果,从而省去查询执行过程

缓存中没有相应记录,则进入正常的查询流程,由查询优化器和执行引擎处理

缓存失效

总结:频繁的数据修改可能会导致缓存失效

缓存的数据在表数据更新(如插入、更新、删除)后会失效,因为数据的一致性要求缓存的结果必须反映最新的数据状态

尤其是在写操作频繁的应用场景下,缓存的有效性受限。频繁的数据修改会导致缓存失效,从而增大缓存维护成本

传统缓存的替代方案

 使用分布式缓存系统(如Redis、Memcached)来缓存常用查询结果,减少数据库的直接访问,提升系统整体性能

3.6 SQL语句执行流程分析