mysql 使用InnoDB 引擎时候的存储文件系统初探

来源:互联网 发布:cf刷枪软件免费版 编辑:程序博客网 时间:2024/06/08 04:39
  1. 新建立一个数据库时候
    在mysql Server所在地址下的data目录下:
    建立了ibdata1,用来记录InnoDb系统信息和数据库表数据和索引,为所有的表锁公用。
    日志文件: ib_logfile1、ib_logfile2
    mySql在其工作目录的data文件夹下:
    建立一个新的名字为dbName的文件夹,并在里面创建了一个文件,db.opt, 文件的内容是数据库的定义信息
default-character-set=utf8default-collation=utf8_general_ci
  1. 在这个数据库中建立一张表,表名为user1.
CREATE TABLE `user` (  `id` int(11) NOT NULL,  `name` varchar(255) NOT NULL,  `age` int(11) DEFAULT NULL,  `money` double NOT NULL,  `gender` tinyint(4) DEFAULT NULL,  `varc` varchar(32) NOT NULL,  `c32` char(32) NOT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在dbName文件夹下增加了两个文件,user1.frm和user1.ibd;

  1. 然后通过插入数据来观察三个文件的大小变化:ibdata1,user1.frm和user1.ibd;
INSERT INTO user1 (name,age) VALUES ('name1',5);

插入1条数据:
146,800,640 字节
8,614 字节
98,304 字节

插入四条数据:
146,800,640 字节
8,614 字节
98,304 字节

插入几千条数据:
146,800,640 字节
8,614 字节
360,448 字节

我发现,360,448 - 98,304 = 1024*256 , 猜测user1.ibd这个东西是按照1KB定长来扩展的。

  1. 创建一个新的表
CREATE TABLE `user2` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(255) NOT NULL,  `age` int(11) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=7047 DEFAULT CHARSET=utf8;

data文件下的ibdata1的大小不变为了146,800,640字节。
同时,在dbName文件夹下增加了两个文件,
user2.frm和user2.ibd;其初始大小分别为9kb(8,614 字节)和96kb(98,304 字节),与上面相同。

  1. 关于删除操作

删除前:146,800,640 字节,8,614 字节,180,224 字节

使用delete语句删除一千条数据在user2中。

DELETE FROM user2 where id BETWEEN 7000 and 7000+1000;

发现,user2.ibd不减反增加为(192K)196,608字节。

在user3表中,使用Delete语句不加where条件。

DELETE FROM user3 ;受影响的行: 2286时间: 0.082s

发现,user3.ibd不减反增加为(192K)196,608字节。

在user4中使用truncate,

TRUNCATE TABLE user4;

观察到,user4.ibd的大小回到的建表后插入数据之前的大小,98,304 字节。

在user5中使用drop操作,

DROP TABLE user5;

user5.frm和user5.ibd都消失了。

原创粉丝点击