文件
概要
- 文件类型
- 参数文件
- 日志文件
- socket文件
- pid文件
- MySQL表结构文件
- 存储引擎文件
参数文件
- 在MySQL实例启动时,会读取一个参数文件进行初始化。
- MySQL可以没有参数文件。如果没有参数文件,就以源代码中的默认值为标准。
- MySQL的参数分为动态参数,静态参数。动态参数可以在MySQL实例运行的时候更改,而静态参数在MySQL实例的整个生命周期内都不能更改。
日志文件
- 记录了影响了MySQL数据库的各中类型的活动。
- 日志文件的类型一般包括:错误日志,二进制日志,慢查询日志,查询日志。
- 慢查询日志,会记录运行超过long_query_time(默认值为10s)的sql语句。
- 查询日志,记录了所有对MySQL数据库的请求。默认文件名为:主机名.log。未能正确执行的请求也会被记录。
- 二进制日志,记录所有对MySQL进行更改的操作。其作用包括恢复数据,复制,审计。
套接字文件
- 在unix系统下连接本地MySQL可以使用unix套接字方式。该方式需要一个套接字文件。
pid文件
- MySQL启动时会把自己的进程id写入pid文件中。
表结构定义文件
- MySQL每个表对应一个表结构文件,文件名伟*.frm。表结构文件也会保存视图的定义。
存储引擎文件
表空间文件
- innodb存储引擎把数据按表空间进行存放。可以通过参数innodb_data_file_path进行配置。
- 可以配置不同磁盘的文件组成一个表空间文件来平均负载,提升性能。
- 配置了innodb_data_file_path参数后,innodb存储引擎的所有表都会存在该共享表空间中。
- 通过配置参数innodb_file_per_table,每个表都会生成一个表空间。命名规则为*.ibd。但是,.ibd文件只存放数据、索引和插入缓存,其余信息还是存放在共享表空间中。

重做日志文件
- 官方称其为innodb存储引擎日志文件。其自己了与innodb有关的信息。其对保证数据的完整性有帮助。
- 每个innodb存储引擎至少有一个重做日志文件组。为确保可靠性,可以设置多个镜像日志组。
- 重做日志文件的大小对性能的影响较大。
表
索引组织表
- 在innodb存储引擎中,表都是按照主键顺序组织数据的。这种存储方式的表称为索引组织表。
- 如果表创建时没有指定主键,innodb会选择或创建主键。如果表中有非空的唯一索引,则作为主键;否者则创建一个6字节的指针。
innodb存储引擎的逻辑存储结构
- innodb中常见的页类型
- 数据页
- undo页
- 系统页
- 事务数据页
- 插入缓冲位图页
- 插入缓冲位图页
- 插入缓冲闲置列表页
- 插入缓冲空闲列表页
- 未压缩的二进制大对象页
- 压缩的二进制大对象页
innodb行记录格式
innodb存储引擎是面向列的(row-oriented)。
innodb存储引擎提供了compact和redundant(为兼容老版本而保留)两种格式来存放行记录信息。
-
- 变长字段长度列表:如果列的长度小于255字节,用1个字节标识;如果大于255字节,用2字节标识。采用逆序存放的方式。
- Null标志位:占用一个字节,有为Null的列,用1表示。空值不占用空间。
- 记录头信息:固定占用5个字节。每位有不同的含义。
- 隐藏列:除了用户定义的列,还存在两个隐藏列,分别是事务Id列和回滚指针列。
-
- 字段长度偏移列表:和compact行记录的格式相同。
- 行记头占用六个字节,每位都有独特的含义。
行溢出数据
innodb存储引擎可以把某些数据存储再真正的页面之外。一般认为text和blob这些大对象存储在真正的页面之外。varchar也有存储在行溢出页的可能。因为innodb采用了B+树索引组织,每页必须要有两条行记录才有意义,所以如果一页只有一条记录,那么innodb存储引擎会自动将数据存放到溢出页中。
innodb数据页结构
页是innodb存储引擎管理数据库的最小磁盘单位。
约束
数据完整性
数据库系统与文件系统的一个重要不同之处在于数据库系统本身能确保数据的完整性,不需要应用程序的控制。一般可以通过:选择合适的数据类型确保一个值满足特定的条件;外键约束;编写触发器可以使用默认来强制确保域的完整性。
- innodb中确保数据完整性的方案
- primary key
- unique key(唯一索引)
- foreign key
- default
- not null
- 触发器
作用是在执行insert,delete,update命令之前或之后自动调用的sql命令或存储s



