Skip to content

MySQL 存储结构与文件布局

存储结构

表空间

共享表空间

  • 所有表和索引共享一个或多个表空间文件
  • 默认文件:ibdata1, ibdata2等
  • 存储系统表、撤销日志、临时表等
  • 适合小型数据库或集中管理场景

独立表空间

  • 每个表有自己独立的表空间文件
  • 文件命名格式:table_name.ibd
  • 存储表数据和索引
  • 便于管理和维护
  • MySQL 5.6及以上版本默认使用

数据文件结构

段(Segment)

  • 由一个或多个区组成
  • 用于存储表数据、索引等
  • 分为数据段、索引段、回滚段等

区(Extent)

  • 由连续的页组成
  • 默认大小为1MB
  • 包含64个连续页(每页16KB)
  • 用于减少I/O操作

页(Page)

  • MySQL的基本存储单位
  • 默认大小为16KB
  • 可以通过配置调整
  • 包含数据页、索引页、undo页等

行(Row)

  • 存储表中的一行数据
  • 包含行头、数据和指针
  • 支持变长和定长数据类型
  • 行格式包括COMPACT、REDUNDANT、DYNAMIC等

文件布局

数据目录结构

MySQL数据目录包含以下主要文件和目录:

  • 数据库目录:每个数据库对应一个子目录
  • 表文件:存储表结构和数据
  • 日志文件:记录数据变更和服务器状态
  • 配置文件:存储服务器配置
  • pid文件:存储进程ID
  • socket文件:用于本地连接

主要文件类型

表定义文件

  • .frm文件:存储表结构定义
  • .ibd文件:独立表空间文件,存储表数据和索引
  • .MYD文件:MyISAM表数据文件
  • .MYI文件:MyISAM表索引文件

日志文件

二进制日志(Binlog)
  • 文件命名:mysql-bin.000001, mysql-bin.000002等
  • 记录所有数据变更操作
  • 用于复制和恢复
  • 可以通过配置控制文件大小和数量
重做日志(Redo Log)
  • 文件命名:ib_logfile0, ib_logfile1
  • 记录数据变更操作
  • 用于崩溃恢复
  • 确保事务持久性
  • 默认大小为48MB
回滚日志(Undo Log)
  • 存储在表空间文件中
  • 记录数据变更前的状态
  • 用于事务回滚和MVCC
  • 自动管理和清理
错误日志(Error Log)
  • 记录服务器启动、运行和关闭过程中的错误
  • 默认文件名:hostname.err
  • 用于故障诊断
慢查询日志(Slow Query Log)
  • 记录执行时间超过阈值的查询
  • 默认关闭,需要手动启用
  • 用于性能优化
查询日志(General Query Log)
  • 记录所有查询语句
  • 默认关闭,需要手动启用
  • 用于审计和调试

配置文件

  • my.cnf:Linux系统配置文件
  • my.ini:Windows系统配置文件
  • 存储服务器配置参数
  • 支持多实例配置

其他文件

  • pid文件:存储MySQL进程ID
  • socket文件:用于本地连接的Unix套接字文件
  • relay-log文件:从服务器的复制日志
  • master.info文件:从服务器的主服务器信息
  • relay-log.info文件:从服务器的复制状态信息

InnoDB存储引擎文件

系统表空间

  • 包含InnoDB数据字典
  • 存储撤销日志
  • 存储临时表
  • 默认文件:ibdata1

独立表空间

  • 每个表对应一个或多个.ibd文件
  • 存储表数据和索引
  • 支持TRUNCATE和DROP操作的快速执行
  • 便于管理和维护

重做日志文件

  • 保障数据完整性和持久性
  • 实现WAL(Write-Ahead Logging)机制
  • 循环写入,大小固定

双写缓冲区

  • 位于系统表空间
  • 防止部分写入问题
  • 提高数据可靠性
  • 可以通过配置禁用

MyISAM存储引擎文件

表定义文件

  • .frm文件:存储表结构

数据文件

  • .MYD文件:存储表数据
  • 堆表结构
  • 不支持事务

索引文件

  • .MYI文件:存储表索引
  • B-tree索引结构
  • 支持全文索引

临时表空间

会话临时表空间

  • 用于存储会话级临时表
  • 每个会话一个临时表空间
  • 会话结束时自动清理

全局临时表空间

  • 用于存储全局临时表
  • 服务器重启时自动清理
  • 支持多版本并发控制

文件管理

文件创建与删除

  • 表创建时自动创建对应的数据文件
  • 表删除时自动删除对应的数据文件
  • 可以通过ALTER TABLE命令修改表空间

文件扩展

  • 共享表空间自动扩展
  • 独立表空间可以手动或自动扩展
  • 可以通过配置控制扩展大小

文件检查与修复

  • mysqlcheck:检查和修复表
  • innodb_checksum_algorithm:验证页完整性
  • ibd2sdi:从.ibd文件提取表结构

性能优化

文件布局优化

  • 分离数据文件和日志文件
  • 使用SSD提高I/O性能
  • 配置合适的RAID级别
  • 优化文件系统参数

表空间优化

  • 使用独立表空间
  • 合理设置表空间大小
  • 定期优化表空间
  • 考虑使用压缩表

日志文件优化

  • 配置合适的日志文件大小
  • 分离日志文件和数据文件
  • 优化日志写入策略
  • 定期清理旧日志文件

常见问题(FAQ)

Q1:MySQL的数据文件有哪些?

A1:MySQL的数据文件包括:.ibd(InnoDB独立表空间)、.frm(表定义)、.MYD(MyISAM数据)、.MYI(MyISAM索引)、二进制日志、重做日志等。

Q2:共享表空间和独立表空间有什么区别?

A2:共享表空间所有表共享一个或多个文件,独立表空间每个表有自己的文件。独立表空间便于管理和维护,共享表空间适合小型数据库。

Q3:如何查看表空间使用情况?

A3:可以使用SHOW TABLE STATUS命令查看表空间使用情况,或使用INFORMATION_SCHEMA.TABLES视图。

Q4:如何优化MySQL的文件布局?

A4:可以通过分离数据文件和日志文件、使用SSD、配置合适的RAID级别、优化文件系统参数等方式优化文件布局。

Q5:MySQL的页大小是多少?

A5:MySQL默认页大小为16KB,可以通过配置调整,但不建议修改。

Q6:如何清理MySQL的日志文件?

A6:可以使用PURGE BINARY LOGS命令清理二进制日志,或配置expire_logs_days参数自动清理。

Q7:InnoDB的双写缓冲区是什么?

A7:双写缓冲区是InnoDB的一个安全机制,防止部分写入问题,提高数据可靠性,默认启用。

Q8:如何修改InnoDB的重做日志大小?

A8:可以通过修改innodb_log_file_size和innodb_log_files_in_group参数调整重做日志大小,需要重启服务器。