加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

InnoDB的外存数据构架介绍

发布时间:2022-01-17 21:44:02 所属栏目:编程 来源:互联网
导读:这篇文章主要讲解了InnoDB的外存数据结构介绍,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习InnoDB的外存数据结构介绍吧! PartⅠ 表和表空间 Everything is a file这句至理名言告诉我们一切都得从文件说起
        这篇文章主要讲解了“InnoDB的外存数据结构介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“InnoDB的外存数据结构介绍”吧!
 
PartⅠ 表和表空间
       “Everything is a file…”这句至理名言告诉我们一切都得从文件说起。那么对 InnoDB 外存数据结构的学习,我们也先从表和文件开始。
 
一、表 ( Table )
当我们使用 CREATE TABLE 创建一个表时,MySQL 会创建一个 .frm 文件和一个 .ibd 文件。.frm 文件是描述表结构定义的文件,而 .ibd 文件是 InnoDB 引擎层特有的,用于记录InnoDB表的数据。举个例子,在 db.CCCtest 下创建一个表”jersey_test”,建表语句如下:
 
CREATE TABLE `jersey_test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `requestId` char(64) NOT NULL COMMENT 'request',
  `type` smallint(6) NOT NULL DEFAULT '0' COMMENT '类型',
  `name` varchar(64) NOT NULL COMMENT 'name',
  PRIMARY KEY (`id`),
  KEY `request` (`requestId`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
 
二、Row Formats
InnoDB 中的表都是分文件存储的,表中的行数据也按照相应的格式记录在文件中。这里我们简要归纳一下 InnoDB 所支持的文件存储格式和行存储格式。InnoDB 的文件格式由参数 innodb_file_format 指定,它支持 Antelope 和 Barracuda 两种文件格式。Barracuda 是新的文件格式,它是包含 Antelope 格式在内的。Antelope 文件格式支持两种行存储格式,Compact 和 Redundant ,Barracuda 支持的新的行存储格式为 Compressed 和 Dynamic。
 
InnoDB的外存数据结构介绍[ InnoDB行存储格式 ]
 
InnoDB 表的行存储格式由参数 innodb_default_row_format 指定,在 5.7 版本中的默认值为 Dynamic 。行存储格式决定了表中的记录在文件中是如何进行存储的,不同的行存储格式有其特殊的优势和劣势,也会影响数据库的行为。例如,使用 Compressed 这种格式可以使行记录有更高的压缩比,如果一个物理页能存放的行记录越多,它的索引或记录查找会更快,内存消耗也会更小,但是压缩数据本身也会带回额外的系统开销。另外一个需要注意的地方是,在进行数据库表迁移时,需要关注源实例和目标实例的 Row Format 是否匹配。比如你有一个 MyISAM 的表要迁移到 InnoDB 上,并且 MyISAM 表的 Row Format 为默认值 Fixed ,此时需要改成 Dynamic ,因为这两种格式对变长字段如 varchar/blob/text 等的处理是不一致的。
 
三、表空间 ( TableSpace )
我们前面谈到,InnoDB 每个表都有自己独立的文件,其实是用到了它的默认行为,即使用独立表空间,它由参数 innodb_file_per_table 控制。事实上 InnoDB 包含多种表空间类型,包括系统表空间 ( System TableSpace ),独立表空间 ( File-Per-Table TableSpace ) 和通用表空间 ( General TableSpace ) 等。
 
系统表空间存储了 InnoDB 的数据字典(元数据信息),系统表,双写缓冲区 ( doublewrite buffer ),Change Buffer 等。如果将参数 innodb_file_per_table 置为 OFF ,即所有的表数据都存储在系统表空间中。但是在使用 InnoDB 时,更推荐的方法是将 innodb_file_per_table 置为 ON,即使用独立表空间,它有如下几个好处:
 
当使用 Truncate Table 和 Drop Table 命令删除表时,系统会直接删除表的数据文件,即回收物理空间。而使用系统表空间则无法回收这些物理空间;
和上面类似,当使用重建表的语法时,如 OPTIMIZE TABLE 或者 ALTER TABLE ENGINE = InnoDB 时,系统也能够回收物理空间;
可以单独将某个表指定到对应的存储位置,这个存储位置可以不在 MySQL 的数据目录下。比如你想使用 RAID 或者 SSD 来存储某个表,当你使用独立表空间时,就可以通过 CREATE TABLE … DATA DIRECTORY 这个语法来实现。
使用独立表空间也有一些潜在的问题。例如,每个表都有自己的单独的文件,容易造成物理空间的浪费,如果数据库有很多小表的话,这种空间浪费也会比较明显。通用表空间 ( General TableSpace ) 可以缓解这个问题。通用表空间可以认为是 all-in-one (系统表空间) 和 file-per-table 的一个折中,它允许你使用 CREATE TABLESPACE 语法创建一个大的空间,然后你可以向这个空间中添加一些表的数据文件进行存储,这些表的数据文件是共享存储空间的。

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读