InnoDB Insert(插入)操作(上)--mysql技术内幕

原创 2015年07月06日 22:18:34

当客户端发出一条insert指令后,对于一张innodb类型的表,它的内部究竟会做出怎样的反应呢?本文章将为大家揭开这 一内幕。当然,本人才疏学浅,如果你发现了什么不对的地方,可以指出来,大家一起讨论。

突然发现用文字很难解释清楚这个过程,那么就用一张图来代替吧,反而更加清晰明了。我还没有搞清楚的问题是:bin_log的写入时间,commit操作对应redo跟innodb_buffer分别所处的位置。
以上内容是昨天,今天又有了新的发现,请自觉忽略忽略我在图中没有画出binlog_buffer。。我想说的是,开启事务之后,数据写盘是在commit操作前还是在commit后,可能你会觉得这个问题很可笑,认为commit肯定是在数据写磁盘之前,但是我接下来的实验,可能会让你改变这样的想法。暂且做个假设:我们的innodb_buffer大小为1G,而一条insert操作,实际插入了2G的数据,你还确定写磁盘操作是在commit之后吗?实验请看如下:
这里写图片描述
步骤如下:
1,开启手动事务提交

mysql> show variables like’autocommit’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| autocommit | OFF |
+—————+——-+
1 row in set (0.00 sec)

2,建立test.test innodb表

mysql> create table test(id bigint ,salary bigint);
Query OK, 0 rows affected (0.05 sec)

3,查看表空间初始值大小(原谅我手残,刚开始调用了一次存储过程,没有开启手动提交,从12M开始算起)

rw-rw—- 1 mysql mysql 8590 7月 7 21:07 test.frm
-rw-rw—- 1 mysql mysql 12582912 7月 7 21:19 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 12M 7月 7 21:19 test.ibd
4,利用存储过程插入数据(虚拟机,太慢,插了100W条,用了50秒)
mysql> call t(1000000);
Query OK, 1 row affected (50.94 sec)

5,查看表空间大小情况(可以边插边看,好羞涩啊)

root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 12M 7月 7 21:19 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 44M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 44M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 44M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 48M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 48M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 48M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 48M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 48M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 52M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 52M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 52M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 52M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 54M 7月 7 21:21 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd

好吧,表空间在不断的增长。。怎么解释,我想唯一的解释就是数据在commit操作前就已经开始写入磁盘了。

我好奇的进行了rollback操作,看表空间情况。整个100W条数据rollback的时间花了24.65秒。
+—————+——-+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (24.65 sec)

紧接着,,查看表空间大小

-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd

然而,表空间也没有缩小。

搞技术的就是喜欢打破沙锅问到底,我想再插一遍,看表空间是否还会增大,

mysql> call t(1000000);
Query OK, 1 row affected (38.14 sec)

-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 60M 7月 7 21:36 test.ibd
[root@ashe test]# ls -lh test.ibd
-rw-rw—- 1 mysql mysql 60M 7月 7 21:49 test.ibd
[root@ashe test]#

马丹,,60M,我觉得我应该多看看innodb内核的资料了,甚至应该看一下它的源码,去找寻心中的疑惑。

版权声明:本文为博主原创文章,未经博主允许不得转载。

内核调试神器SystemTap — 探测点与语法(二)

SystemTap脚本主要是由探测点和探测点处理函数组成的,来看下都有哪些探测点可用。 The essential idea behind a systemtap script is to name ...

SystemTap使用技巧【一】

SystemTap是一个强大的调试工具,确切的说应该是一门调试语言,因为它有自己的语法,也有解析、编译、运行等过程(准确的说有五个阶段),但它主要解决的问题是收集Linux内核或者用户进程的信息,主要...

【读过的书,留下的迹】MySQL技术内幕-InnoDB存储引擎

一、MySQL体系结构和存储引擎 (1)MySQL存储引擎 InnoDB存储引擎 支持事务 支持行锁 支持外键 支持非锁定读 MyISAM存储引擎 不支持事务 表锁 支持全文索引 二...
  • linxdcn
  • linxdcn
  • 2017年06月15日 13:22
  • 186

Mysql技术内幕InnoDB存储引擎——事务&备份&性能调优

事务       transaction是数据库区别于文件系统的重要特性之一,innodb引擎完全符合事务的ACID特性。       Atomicity 原子性       Consisten...

Mysql Innodb 技术内幕读书笔记

Inndb存储引擎 mvcc 多版本并发控制 -> 高并发性 innodb 实现了四种隔离机制,默认可重复读 next-key-locking 避免幻读 插入缓冲 二次写 自适应hash 预读 Myi...

MySQL技术内幕-InnoDB存储引擎读写笔记(索引概述)

1、InnoDB存储类型表类型     InnoDB存储引擎表类似于Oracle的索引组织表,即使用聚簇索引来组织数据。InnoDB每个表都有一个主键,基于主键的聚簇索引来存放数据(B+树的叶子节点...

mysql 技术内幕 Innodb 存储引擎 第二版 学习 first

mysql 是单进程多线程 1、查看mysql  进程 ps -ef | grep  mysqld 5098就是其进程 2、查看mysql 配置文件位置  mysql --help | g...

MySQL技术内幕 InnoDB存储引擎(一)

第一章-MySQL体系结构和存储引擎 1定义数据库和实例 “数据库”(database)和“实例”(instance)是两个容易被混淆的概念。 其中,数据库是指:物理操作系统文件或其他形式文件...

MySQL技术内幕 InnoDB存储引擎(二)

InooDB存储引擎 1.体系架构 从图中可以看到有二块内容 (1)后台线程:负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。此外将已修改的数据文件刷新到磁盘文件,同...

MySQL技术内幕InnoDB存储引擎学习笔记(第三章)

第三章 文件 一、实验环境 宿主机系统:windows7 虚拟机:OracleVMVirtualBox Linux:ubuntukylin-14.04.1-amd64.iso jdk:1.7...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:InnoDB Insert(插入)操作(上)--mysql技术内幕
举报原因:
原因补充:

(最多只允许输入30个字)