MySQL是如何存储数据的

1.MySQL的整体架构介绍

mysql如何存储文件 mysql怎么存储文章_数据库

2.MySQL的磁盘文件介绍

MySQL在Linux中的数据索引文件和日志文件一般默认都在/var/lib/mysql目录下。

2.1日志文件
  • 错误日志(errorlog)

默认的错误日志名称:hostname.err

  • 二进制日志(bin log)

默认是关闭的

  • 通用查询日志

默认情况下通用查询日志是关闭的,不建议开启

  • 慢查询日志(slow query log)
  • 重做日志文件(redolog)
  • 回滚日志(undo log)
2.2表结构文件

mysql如何存储文件 mysql怎么存储文章_数据库_02

  • frm文件

    mysql数据的存储都是基于表的,每个表都有一个对应的表结构文件。不论表使用的哪一种存储引擎,MySQL都会为表生成一个frm为后缀名的文件,这个文件记录了这个表的表结构定义。
2.3数据文件

存储引擎负责对表中数据的读取和写入,每个存储引擎会以自己的方式来保存表中的数据,在不同存储引擎中数据存放的方式一般是不同的。

MySQL的数据文件存放在位置,可以通过参数datadir控制

查看MySQL数据文件
SHOW VARIABLES LIKE ‘%datadir%’;
  • InnoDB数据文件

ibd文件

mysql如何存储文件 mysql怎么存储文章_面试_03

使用独享表空间存储表数据和索引信息,一张表对应一个ibd文件。

ibdata文件

mysql如何存储文件 mysql怎么存储文章_mysql如何存储文件_04

使用共享表空间存储表数据和索引信息,所有表共同使用一个或者多个ibdata文件。

  • MyIsam数据文件
    myd文件
    主要用来存储表数据信息
    myi文件
    主要用来存储表数据文件中任何索引的数据树

3.MySQL索引结构介绍

InnoDB存储引擎逻辑存储结构可分为五级:表空间、段、区、页、行。

mysql如何存储文件 mysql怎么存储文章_数据库_05

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个页中包含多个行。