mysql的物理存储结构主要由数据文件、日志文件及存储引擎特定的组织方式构成。以下是其核心组成部分的详细说明:
1. 数据目录结构
mysql的数据存储在datadir
配置指定的目录中,通常包含以下内容:
数据库目录:每个数据库对应一个子目录(如/var/lib/mysql/db_name
),内部存放表的结构和数据文件。
表文件:不同存储引擎的表文件类型不同:
- innodb:
.ibd
(独立表空间文件)和.frm
(8.0之前的结构文件,8.0后元数据存储在数据字典中)。 - myisam:
.myd
(数据文件)、.myi
(索引文件)和.frm
(结构文件)。 - memory引擎:数据仅存储在内存中,无磁盘文件(表结构仍存于
.frm
)。
2. innodb存储引擎的物理结构
innodb采用索引组织表(iot),数据按主键顺序存储,物理结构分层如下:
表空间(tablespace)
- 系统表空间(ibdata1):存储数据字典、undo日志(8.0前)、change buffer等。默认包含所有表的数据(若未启用独立表空间)。
- 独立表空间(.ibd文件):每个表独立存储数据和索引(默认启用),提升管理灵活性。
- 通用表空间:可存储多个表的数据,通过
create tablespace
创建。 - undo表空间(8.0+):独立存储undo日志,默认
undo_001
和undo_002
。 - 临时表空间:存储临时表和排序操作数据。
存储单元层级
- 段(segment):由多个区组成(如数据段、索引段、回滚段)。
- 区(extent):由连续64个页构成(默认1mb,每页16kb)。
- 页(page):最小磁盘管理单元(16kb),包含页头、行记录、页尾等信息。
- 行(row):数据按行格式(如compact、dynamic)存储,dynamic格式处理大字段时仅存储溢出页指针。
日志文件
- redo log(ib_logfile)*:物理日志,记录数据页修改,用于崩溃恢复。
- undo log:逻辑日志,支持事务回滚和mvcc(8.0后存于undo表空间)。
3. myisam存储引擎的物理结构
数据与索引分离:表由三个文件组成:
.frm
:表结构定义(8.0前)。.myd
:数据文件,按插入顺序存储。.myi
:索引文件,支持全文索引和压缩表。
特性:表级锁、无事务支持,适合读多写少场景。
4. 日志文件
- 二进制日志(binlog):记录所有数据更改操作,用于主从复制和点恢复。
- 错误日志(error log):记录服务器运行状态和错误信息。
- 慢查询日志(slow query log):记录执行时间超过阈值的sql语句。
5. 内存结构辅助
- 缓冲池(buffer pool):innodb缓存数据页和索引,减少磁盘i/o。
- change buffer:缓存非唯一索引的变更,提升写入性能。
版本差异与注意事项
- mysql 8.0+:移除
.frm
文件,元数据存于数据字典(mysql.ibd
);默认undo日志独立。 - 配置选项:
innodb_file_per_table
控制是否启用独立表空间。 - 行溢出处理:dynamic行格式对大字段(如blob)仅存储20字节指针,数据存于溢出页。
总结
- innodb:适合事务处理,通过表空间、页结构和日志机制保障acid。
- myisam:轻量级,适合静态数据,物理结构简单但缺乏事务支持。
- 日志系统:保障数据持久性和系统可恢复性。
理解物理存储结构有助于优化数据库设计(如选择行格式、分区策略)和故障排查(如分析文件损坏问题)。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论