# 基础架构
MySQL
的基本架构示意图( 🎏 网络图片,学习使用,侵权删除)
大体来说MySQL
分为Server
层和储存引擎层两部分。
Server
层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL
的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。- 存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持
InnoDB
、MyISAM
、Memory
等多个存储引擎。现在最常用的存储引擎是InnoDB
,它从MySQL 5.5.5
版本开始成为了默认存储引擎。
# 连接器
连接器负责跟客户端建立连接、获取权限、维持和管理连接
# 查询缓存
MySQL
拿到一个请求后,会先去查询缓存看看、之前是不是执行过这条语句。之前执行过的语句可能会以key-value
对的形式被直接放在内存。如存在直接返回结果,不存在则查询,并将结果记入缓存。
对于更新压力大的数据库来说,查询缓存的命中率会非常低。
需要注意的是,
MySQL 8.0
版本直接将查询缓存的整块功能删掉了,也就是说8.0
已经没有缓存了。
# 分析器
对SQL
语句做词法分析、语法分析,如果你的SQL
语句不对,就会收到You have an error in your SQL syntax
的错误提醒。
# 优化器
优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join
)的时候,决定各个表的连接顺序。
# 执行器
根据表的引擎定义,去使用这个引擎提供的接口。
# InnoDB存储引擎架构图
从这张图可以看到,InnoDB
存储结构主要包括两部分:逻辑存储结构和物理存储结构。
逻辑上是由表空间tablespace
—> 段segment
或者inode
—> 区Extent
——>数据页Page
构成,Innodb
逻辑管理单位是segment
,
空间分配的最小单位是extent
,每个segment
都会从表空间FREE_PAGE
中分配32
个page
,当这32
个page
不够用时,会按照以下原则进行扩展:
如果当前小于1
个extent
,则扩展到1
个extent
;当表空间小于32MB
时,每次扩展一个extent
;表空间大于32MB
,每次扩展4
个extent
。
物理上主要由系统用户数据文件,日志文件组成,数据文件主要存储MySQL
字典数据和用户数据,日志文件记录的是data page
的变更记录,用于MySQL Crash
时的恢复。