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:将数据存储在内存中,速度快但数据不持久。
文件系统层
- 负责将数据以及日志文件存储在操作系统的文件系统上
- 日志文件(如
redo
、undo
、错误日志等) - 数据库数据文件、二进制日志和配置文件
缓存与缓冲区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
)以及操作对象(如表和字段) - 解析树为后续的查询优化和执行提供了基础
- 解析树是SQL语句的结构化表示,包含语句的操作类型(如
3.4 Optimizer-查询优化器
查询优化器的目的就是在多种执行方案中寻找最佳方案,从而使得SQL查询的执行更加高效,其内部通过索引选择、连接优化、条件过滤和查询重写等手段实现该目标。目的就是提高其搜索性能
优化后的SQL语句在条件查询的时候可能与自己写的查询条件过滤顺序不同
3.5 Buffer-缓存
缓存机制可以显著提高查询性能,但在高写入频率的场景中会导致缓存失效频繁,反而影响效率。因此MySQL从5.6版本开始默认关闭查询缓存,并在8.0版本中完全移除。在现代应用中,推荐使用外部缓存来实现对高频查询的优化
缓存作用分析
当服务器接收到SELECT
查询时,会先检查缓存中是否已存有该查询的结果。若缓存中存在相同的查询(使用键值对形式存储,key为查询SQL语句,value为结果集),则直接返回缓存的结果,从而省去查询执行过程
缓存中没有相应记录,则进入正常的查询流程,由查询优化器和执行引擎处理
缓存失效
总结:频繁的数据修改可能会导致缓存失效
缓存的数据在表数据更新(如插入、更新、删除)后会失效,因为数据的一致性要求缓存的结果必须反映最新的数据状态
尤其是在写操作频繁的应用场景下,缓存的有效性受限。频繁的数据修改会导致缓存失效,从而增大缓存维护成本
传统缓存的替代方案
使用分布式缓存系统(如Redis、Memcached)来缓存常用查询结果,减少数据库的直接访问,提升系统整体性能