MySQL是如何存储数据的
1.MySQL的整体架构介绍
2.MySQL的磁盘文件介绍
MySQL在Linux中的数据索引文件和日志文件一般默认都在/var/lib/mysql
目录下。
2.1日志文件
- 错误日志(errorlog)
默认的错误日志名称:hostname.err
- 二进制日志(bin log)
默认是关闭的
- 通用查询日志
默认情况下通用查询日志是关闭的,不建议开启
- 慢查询日志(slow query log)
- 重做日志文件(redolog)
- 回滚日志(undo log)
2.2表结构文件
- frm文件
mysql数据的存储都是基于表的,每个表都有一个对应的表结构文件。不论表使用的哪一种存储引擎,MySQL都会为表生成一个frm为后缀名的文件,这个文件记录了这个表的表结构定义。
2.3数据文件
存储引擎负责对表中数据的读取和写入,每个存储引擎会以自己的方式来保存表中的数据,在不同存储引擎中数据存放的方式一般是不同的。
MySQL的数据文件存放在位置,可以通过参数datadir
控制
查看MySQL数据文件
SHOW VARIABLES LIKE ‘%datadir%’;
- InnoDB数据文件
ibd文件
使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。
ibdata文件
使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文件。
- MyIsam数据文件
myd文件
主要用来存储表数据信息
myi文件
主要用来存储表数据文件中任何索引的数据树
3.MySQL索引结构介绍
InnoDB存储引擎逻辑存储结构可分为五级:表空间、段、区、页、行。
3.1表空间
从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。
从功能上来看,InnoDB存储引擎的表空间分为系统表空间,独占表空间,通用表空间,临时表空间,Undo表空间。
- 如果开启了独立表空间innodb_file_per_table=1,每张表一个单独的.ibd文件。
- 如果关闭了独立表空间innodb_file_per_table=0,所有基于InnoDB存储引擎的表数据都会记录到系统表空间,文件名为ibdata1。
3.2段
表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等
3.3区
一个区由64个连续的页组成,一个区的大小=1M=64个页(16K)。
3.4页
- InnoDB 每个页默认大小时是 16KB,页是InnoDB管理磁盘的最小单位,也InnoDB中磁盘和内存交互的最小单位。
- 索引树上一个节点就是一个页,MySQL规定一个页上最少存储2个数据项。如果向一个页插入数据时,这个页已将满了,就会从区中分配一个新页。如果向索引树叶子节点中间的一个页中插入数据,如果这个页是满的,就会发生页分裂。
- 操作系统管理磁盘的最小单位是磁盘块,是操作系统读写磁盘最小单位,Linux中页一般是4K,可以通过命令查看。
3.5行
InnoDB的数据是以行为单位存储的,1个页中包含多个行。