Appearance
MySQL架构概览
架构图
Server层
- 连接器
负责与客户端应用程序建立连接,并进行身份验证和权限检查。每个客户端连接到MySQL时,都会创建一个对应的连接器。
- 查询缓存
用于缓存已经执行过的SELECT语句的结果集。当接收到相同的查询请求时,MySQL可以直接从缓存中返回结果,从而提高查询性能。然而,由于缓存更新和维护的开销较大,查询缓存通常会被禁用。
缓存数据对应的数据在被更新之后将会失效,尤其在写多读少的场景中,缓存会频繁失效与新增,命中率非常低,因此MySOL5.6之后服务层缓存功能默认关闭,而且在MySQL8.0中服务层缓存被官方删除。
- 解析器
对SQL语句进行语法分析和解析,生成语法树。解析器会对SQL语句进行语法检查,并将语句分解为可执行的命令。
- 优化器
对查询语句进行优化,选择最优的执行计划。优化器会根据统计信息和索引等信息,估算各种执行计划的代价,并选择最佳的执行路径。 5. 执行器
负责执行查询语句的具体操作。它会根据优化器选择的执行计划,逐步执行各个子操作,获取和返回结果。
- 缓冲池
用于缓存数据页,提高数据的读取和写入性能。MySQL使用缓冲池来管理内存中的数据页,减少对磁盘的访问。
- 锁管理器
用于管理并发访问数据库的锁机制。MySQL使用锁管理器来保证并发事务的隔离性和一致性,防止数据冲突和并发问题。
存储引擎层
存储引擎有多种可选,重点是InnoDB,其它还有MyISAM和Memory
- InnoDB
支持事务及多版本控制(MVCC),支持外键,是MySQL的默认存储引擎(从MySQL 5.5开始)。它使用独立的.ibd文件存储数据和索引信息,.frm文件存储表结构。
- MyISAM
不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。它使用.myd文件存储数据,.myi文件存储索引,.frm文件存储表结构。
- Memory
使用存在内存中的内容来创建表,每个MEMORY表实际对应一个磁盘文件(.frm)。MEMORY类型的表访问非常快,但一旦服务器关闭,表中的数据就会丢失。
文件系统层
1.日志文件
1) error log
记录MySQL启动、运行、关闭时发生的错误的相关信息,默认开启
2) general query log
记录MySQL接收到的每一个查询SQL,默认不开启
3) slow query log
log_query_time:默认值10,单位s 记录运行时间超过log_query_time的所有SQL语句以及信息:执行时刻、消耗的时间、执行的用户、连接主机等,默认不开启
4) binary log
记录对数据的修改操作,并且记录操作发生的时间、执行的时长,默认不开启。MySQL自带的日志 修改操作包括增删改,不会记录select、show等不修改数据库的SQL语句,主要用于数据库恢复和主从复制
5) redo log
记录对数据的修改操作,即MySQL某行表数据的某个字段值从x修改为y,用于宕机后恢复数据。InnoDB存储引擎独有日志
6) undo log
记录被修改前的原始数据,用于事务回滚
2. 数据文件
- 库、表信息文件:
db.opt文件:保存数据库使用的字符集和验证规则等信息的文件,MySQL8.0不再使用
.frm文件:表结构信息文件,每张表对应一个.frm文件,MySQL8.0不再使用
- MyISAM存储引擎独有文件
.MYD文件:存放表数据,每张表对应一个.MYD文件
.MYI文件:存放表索引,每张表对应一个.MYI文件
.sdi文件:MySQL8.0使用的表结构信息文件,每张表对应一个sdi文件
- InnoDB存储引擎独有文件 MySQL8.0不再使用frm文件,表结构信息合并到表空间文件中
ibdata1文件:系统表空间文件,即共享表空间。包含表的元数据、undo log、change buffer和doublewrite buffer。 默认1个,大小12M,路径在数据目录下,大小自动随着数据不断增加,可通过参数innodb_data_file_path配置
.ibd文件:独立表空间文件,只存放表数据、索引、insert buffer bitmap,其余信息依然存放在系统表空间,每张表对应一个.ibd文件
ib_logfile0, ib_logfile1文件:重做日志文件,即redo log file,日志个数默认2个
3. 其它文件
包括:配置文件、pid文件、socket文件