MySQL的ibdata1

2019-03-02

MySQL使用InnoDB引擎的时候,ibdata1这个文件会随着时间的增长,会变得越来越大,占据大量的磁盘空间。 那么,ibdata1里保存了哪些东西,为什么会变得越来越大呢,让我们开看看ibdata1的构造。 ibdata1是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件ibdata1中,会造成这个文件越来越大。 索引组织表 在InnoDB中,表是按照主键顺序组织存放的,被称为索引组织表。每张表都有主键,如果没有显性指定,会自动按照如下规则选定 首先判断是否有非空的唯一索引(unique not null),有则为主键 否则自动创建一个6字节大小的指针 可以使用_rowid来查看单列的主键值,多列共同形成的主键就看不了。 表空间:存放表的所有数据 段:分为数据段,索引段,回滚段等。数据段为B+树的叶子节点,索引段为非叶子节点。 区:区由连续的页组成,每个区的大小为1MB,InnoDB每次会申请4-5个区来保证数据的连续性。默认下,每个页为16KB,一个区有64个连续的页。 页:页是InnoDB磁盘管理的最小单位,通过innodb_page_size可以修改页的大小。常见的页类型有数据页(B-tree Node),undo页,系统页,事务数据页,插入缓存位图页,插入缓存空闲列表页,未压缩的二进制大对象页,压缩的二进制大对象页 ---------- 发现问题所在之后,解决方法就是,使用独享表空间,将表空间分别单独存放。MySQL开启独享表空间的参数是Innodb_file_per_table,会为每个Innodb表创建一个.ibd的文件。