Innodb存储结构
innodb逻辑存储单元主要分为表空间,段,区,和页。
tablespace->segment->extent(64个page,1MB) ->page
page 是存储的最小单元
show global variables like ‘innodb_page_size’;
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| innodb_page_size | 16384 |#默认16K
±-----------------±------+
1 row in set (0.00 sec)
1,表空间
innodb存储引擎表中所有数据都是存储在表空间中的,表空间又分为系统表空间,它一ibdata1来命名,在安装数据库初始化时就是
系统咋创建一个ibdata1的表空间文件,它会存储所有数据的信息以及回滚段(undo)的信息,在mysql5.6之后,undo表空间可以通过参数
单独设置存储位置了,可从ibdata1中独立出来,innodb_data_file_path负责定义系统表空间的路径,初始化大小,自动扩展策略,
数据库默认的自动扩展大小是64MB,
show global variables like ‘innodb_autoex%’;
±----------------------------±------+
| Variable_name | Value |
±----------------------------±------+
| innodb_autoextend_increment | 64 |
±----------------------------±------+
1 row in set (0.00 sec)
默认ibdata1大小为10MB,在遇到高并发事物时,会受到影响,生产设置2G
show global variables like ‘innodb_data%’;
±----------------------±-----------------------+
| Variable_name | Value |
±----------------------±-----------------------+
| innodb_data_file_path | ibdata1:1024M:autoextend |
| innodb_data_home_dir | |
±----------------------±-----------------------+
2 rows in set (0.01 sec)
除了系统表空间还有独立表空间,设置参数innodb_file_per_table=1即可,每个表都有自己独立的表空间文件,便于管理,
而不用存储在ibdata1中,独立表空间文件存储对应表的B+树数据,索引和插入缓冲等信息,其余文件存储还是默认表空间文件中
如下.ibd即独立表空间
-rw-r-----. 1 mysql mysql 61 2月 6 11:29 db.opt
-rw-r-----. 1 mysql mysql 8556 2月 6 11:29 t1.frm
-rw-r-----. 1 mysql mysql 98304 2月 6 11:32 t1.ibd
-rw-r-----. 1 mysql mysql 8556 2月 8 05:07 t2.frm
-rw-r-----. 1 mysql mysql 98304 2月 8 05:07 t2.ibd
在说说共享表空间和独立表空间的区别。
独立表空间的每个表都有自己的表空间,并且可以实现表空间的转移,回收表空间也很方便,独立表空间的效率,性能比共享表空间会高一点,
目前默认使用的就是独立表空间存储方式。
mysql5.7之后又出现临时表空间和通用表空间概念
1)临时表空间
mysql5.7把临时表的数据从系统表空间抽离出来,形成自己的独立表空间参数innodb_temp_data_file_path,
并且把临时表的相干检索信息保存在系统信息表的information_schema库下的innodb_temp_table_info表中,
目前还不能定义临时表空间文件的存放路径,只能与innodb_data_home_dir一致。
独立表空间文件名为ibtmp`,默认大小为12MB。
show variables like ‘innodb_temp_data%’;
±---------------------------±----------------------+
| Variable_name | Value |
±---------------------------±----------------------+
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
±---------------------------±----------------------+
1 row in set (0.01 sec)
2)通用表空间
多个表放在同一个表空间中,可以根据或于都划分表,存放在不同的磁盘上,可以减少metadata的存储开销,生产没有使用。
2,段
表空间是由段组成的,也可以把一个表理解为一个段,数据段,索引段,回滚段等,每个段有N个区和32个零散的页组成,通常情况下,
创建一个索引的同时就会创建两个段,叶子节点段和非叶子节点段,创建一个表有4个段,是索引个数的2倍。
3,区
区是连续的页组成,就是物理上连续分配的一段空间,每个区的大小固定是1MB。
4,页
innodb的最小物理存储分配单位是page,有数据页回滚页等,一般情况下一个区由64个连续的页组成,页默认大小是16KB。
区等于64*16KB=1MB,可以修改page大小,每个page会预留1/16的空间用于更新数据,
5,行页里面又记录着行记录的信息,innodb存储引擎是面向行的,也就是数据是按照行存储的,行记录数据又是按照行格式进行存放的,
innodb存储硬气有两种文件格式,antelope,barracuda,
show variables like ‘innodb_file%%’;
±-------------------------±----------+
| Variable_name | Value |
±-------------------------±----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Barracuda |
| innodb_file_per_table | ON |
±-------------------------±----------+
4 rows in set (0.00 sec)
目前最多使用的是compact行记录格式。