InnoDB存储引擎表中所有数据都是存储在表空间中的,表空间分为系统表空间,自定义表空间,系统表空间以ibdatal来命名,存储所有数据信息和回滚段(undo)的信息(mysql 5.6之后可以设置undo存储位置),初始化大小10MB,Innodb_data_file_path负责定义系统表空间的路径,初始化大小,自动扩展策略,默认的扩展大小是64MB,建议将系统表空间大小调整为1G,因为在遇到高并发事务时,数据信息/undo会比较大,会对性能有不小的影响
目前mysql中默认使用的都是独立的表空间,独立表空间中存储对应表的B+树数据,索引数据,插入缓存,其余信息都存储在默认表空间
独立表空间每张表都有自己的表空间,表空间转移、回收表空间比较方便,不过每个表空间都有.frm和.ibd文件两个文件描述符,增长过块会有性能问题
系统表空间也可以理解为共享表空间,共享表空间无法在线回收空间,需将全部Innodb表中数据备份,删除原表,然后再把数据导回到与原表结构一样的新表
mysql5.7之后新增临时表空间和通用表空间
临时表空间就是将临时表的户数从系统表中抽离出来,形成自己独立表空间,参数inndodb_tmp_data_file_path,不过不能定义临时表文件的存放路径,文件名为ibtmpl,默认大小12M
通用表空间就是多个表放在同一表空间中,按照活跃度来划分表,存放在不同的磁盘,目前生产中很少用
表空间是由段组成的,通常有索引段,数据段,回滚段,每个段都是有N个区和32零散页组成,段空间扩展是以区为单位进行扩展,通常创建一个索引会创建2个段,分别为非叶子节点段,叶子结点段。一张表通常有4个段
区是连续的页组成,物理上连续分配的一段空间,大小固定是10M,一般一个区是由64页组成
最小的物流存储单位为页,默认大小是16Kb,1个区大小16*64=1M,mysql5.6可以自定义page大小,从16kb调整为32kb,64kb.
页里面记录行信息,InnoDB存储引擎有两种文件格式:Antelope和Barracuda,Antelope记录格式有compact和redundant,Barracuda记录格式有compressed和dynamic,mysql5.7默认是dynamic记录格式和barracuda文件格式
不同的记录格式区别在于对于行溢出的不同处理方案(行溢出简单来说数据在当前存储页面外,拆分多个页面进行存储),针对于大数据类型text,dynamic将采用的数据存放在溢出的页中,数据页中只存储前20个字节指针,在comapct模式下溢出的页只能存放768个字节