从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为(block),InnoDB存储引擎的逻辑存储结构大致如图:

表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,即所有数据都存放在这个表空间内。如果用户启动了innodb_file_per_table,则每个表内的数据可以单独放到一个表空间内,但要注意的是每张表的表空间内存放的只是数据、索引和插入缓存Bitmap页,而其他类的数据,如回滚(undo)信息,插入缓存索引页、系统事务信息、二次写缓存(Double write buffer)等还是存放在原来的共享表空间内。

现在想说明一个问题的就是,即使设置了innodb_file_per_table为ON了,共享表空间还是会不断地增加其大小,以下做个实验来验证下:

mysql> show global variables like 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
row in set (0.00 sec)

查看共享表空间idbata1目前的大小:

mysql> system du -sh /data/mysql-5.5/ibdata1
26M /data/mysql-5.5/ibdata1

关掉默认的自动提交:

mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec) mysql> set autocommit = 0;
Query OK, 0 rows affected (0.05 sec) mysql> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)

下面创建一个表,并向表里插入20万条数据:

mysql> create table test(id int(2),name char(80))engine=innodb;
Query OK, 0 rows affected (0.05 sec)
mysql> delimiter //
mysql> create procedure load3(count int unsigned)
-> begin
-> declare s int unsigned default 1;
-> declare c char(80) default repeat('a',80);
-> start transaction;
-> while s <= count do
-> insert into test select s,c;
-> set s = s+1;
-> end while;
-> end;
-> //
mysql> call load3(200000)//
Query OK, 1 row affected (6.36 sec)

再查看ibdate1表空间大小,发现已经增大了:

mysql> system du -sh /data/mysql-5.5/ibdata1
35M /data/mysql-5.5/ibdata1

上面插入数据的函数,我没有commit的操作,意味着事务还没提交,下面做回滚操作再查看ibdate1大小:

mysql> rollback//
Query OK, 0 rows affected (1.00 sec) mysql> system du -sh /data/mysql-5.5/ibdata1
35M /data/mysql-5.5/ibdata1

可以看到ibdata1表空间并没有变回之前的26M,虽然InnoDB存储引擎不会回收这些空间,但是会自动判断这些undo信息是否需要,如果不需要,则会将这些空间标记为可用空间,供下次undo使用,master thead每10秒执行一次full purge操作,很有可能的一种情况是:用户再次执行上述的创建数据语句后,会发现ibdata1不会再增大了,那就是这个原因,看以下图

mysql> call load3(100000);
-> //
Query OK, 1 row affected (2.56 sec) mysql> commit//
Query OK, 0 rows affected (0.05 sec) mysql> system du -sh /data/mysql-5.5/ibdata1
35M /data/mysql-5.5/ibdata1

希望写此博客,可以让大家对InnoDB逻辑存储结构有了更深的了解,想了解更多内容,请参考《MySQL技术内幕  InnoDB存储引擎  第2版》

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

InnoDB逻辑存储结构的更多相关文章

  1. InnoDB 逻辑存储结构

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/80 如果创建表时没有显示的定义主键,mysql会按如下方式创建主 ...

  2. MySQL InnoDB 逻辑存储结构

    MySQL InnoDB 逻辑存储结构 从InnoDB存储引擎的逻辑结构看,所有数据都被逻辑地存放在一个空间内,称为表空间,而表空间由段(sengment).区(extent).页(page)组成.p ...

  3. MYSQL Innodb逻辑存储结构

    转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ...

  4. InnoDB存储引擎介绍-(5) Innodb逻辑存储结构

    如果创建表时没有显示的定义主键,mysql会按如下方式创建主键: 首先判断表中是否有非空的唯一索引,如果有,则该列为主键. 如果不符合上述条件,存储引擎会自动创建一个6字节大小的指针. 当表中有多个非 ...

  5. InnoDB存储引擎表的逻辑存储结构

    1.索引组织表:     在InnoDB存储引擎中,表都是依照主键顺序组织存放的.这样的存储方式的表称为索引组织表,在innodb存储引擎表中,每张表都有主键.假设创建的时候没有显式定义主键,则Inn ...

  6. InnoDB的表类型,逻辑存储结构,物理存储结构

    表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...

  7. Innodb页面存储结构-2

    上一篇<Innodb页面存储结构-1>介绍了Innodb页面存储的总体结构,本文会介绍页面的详细内容,主要包括页头.页尾和记录的详细格式. 学习数据结构时都说程序等于数据结构+算法,而在i ...

  8. InnoDB表存储结构及keyring加密

    ibdata是InnoDB最重要的系统表空间文件,它记录了InnoDB的核心信息,包括事务系统信息.元数据信息,记录InnoDB change buffer的btree,防止数据损坏的double w ...

  9. innodb的存储结构

    如下所示,innodb的存储结构包含:表空间,段,区,页(块),行 innodb存储结构优化的标准是:一个页里面存放的行数越多,其性能越高 表空间:零散页+段 独立表空间存放的是:数据.索引.插入缓冲 ...

随机推荐

  1. OneZero第四次站立会议(2016.3.24)

    会议时间:2016年3月24日 15:30~15:47 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论,确定会后修改内容. 会议内容:以下为会议插图 1.界面原型方面,在 ...

  2. Java之序列化和反序列化

    序列化的对象: package test_demo.SerializableOper; import java.io.Serializable; /* * 序列化对象需要实现序列号接口 * */ pu ...

  3. 一本通1646GT 考试

    1646:GT 考试 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 阿申准备报名参加 GT 考试,准考证号为 n 位数 X1X2⋯Xn(0≤Xi≤9),他不 ...

  4. LCM Cardinality UVA - 10892(算术基本定理)

    这题就是 LightOJ - 1236 解析去看这个把https://www.cnblogs.com/WTSRUVF/p/9185140.html 贴代码了: #include <iostrea ...

  5. [JZOJ 5402] God Knows

    终于搞完了这乡里别题目 $ $ 考虑一个 \(dp\) ,设 \(f[i]\) 表示最后一个匹配选 \((i,p[i])\) 的最小费用 首先我们考虑答案长什么样 假设根据 \(p[i]\) 排序 , ...

  6. [Coci2015]Kamp

    Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发 ...

  7. sking

    #include #include #include typedef struct SKI{ int data; int x; int y; char flag; int len; }STSKI; i ...

  8. 查找和替换img src

    $("#imgId")[0].src; //获取 $("#imgId").attr('src',path); //修改

  9. spring boot 配置数据源

    以postgreSQL为例,方便下次直接使用. 其中pom.xml引入如下依赖. <?xml version="1.0" encoding="UTF-8" ...

  10. oracle connect by用法篇 (转)

    1.基本语法 select * from table [start with condition1] connect by [prior] id=parentid 1 2 1 2 一般用来查找存在父子 ...