索引组织表:
在Innodb存储引擎中,表都是根据主键的顺序组织存放的,这种存储方式的表成为索引组织表。如果在创建表时没有显式地定义主键(Primary Key),则InnoDB存储引擎会按如下方式选择或创建主键。
❑首先表中是否有非空的唯一索引(Unique NOT NULL),如果有则该列即为主键。
❑不符合上述条件,InnoDB存储引擎自动创建一个6个字节大小的指针。

逻辑存储结构:
在InnoDB存储引擎的逻辑存储结构中所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。页在一些文档中有时也称为块(block)
这里写图片描述
表空间
空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都是存放在表空间中。默认情况下InnoDB存储引擎有一个共享表空间ibdata1,即所有数据都放在这个表空间内。如果我们启用了参数innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。
对于启用了innodb_file_per_table的参数选项,需要注意的是,每张表的表空间内存放的只是数据、索引和插入缓冲,其他类的数据,如撤销(Undo)信息、系统事务信息、二次写缓冲(double write buffer)等还是存放在原来的共享表空间内。即使在启用了参数innodb_file_per_table之后,共享表空间还是会不断地增加其大小。


表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等。因为前面已经介绍过了InnoDB存储引擎表是索引组织的(index organized),因此数据即索引,索引即数据。那么数据段即为B+树的页节点(leaf node segment),索引段即为B+树的非页节点(non-leaf node segment)。

区是由64个连续的页组成的,每个页大小为16KB,即每个区的大小为1MB。对于大的数据段,InnoDB存储引擎最多每次可以申请4个区,以此来保证数据的顺序性能。

页是InnoDB磁盘管理的最小单位。InnoDB页的大小(16KB),且不可以更改(也许通过更改源码可以)。
常见的页类型有:
❑数据页(B-tree Node)。
❑Undo页(Undo Log Page)。
❑系统页(System Page)。
❑事务数据页(Transaction system Page)。
❑插入缓冲位图页(Insert Buffer Bitmap)。
❑插入缓冲空闲列表页(Insert Buffer Free List)。

❑未压缩的二进制大对象页(Uncompressed BLOB Page)。
❑压缩的二进制大对象页(Compressed BLOB Page)。

InnoDB存储引擎是面向行的(row-oriented),也就是说数据的存放按行进行存放。每个页存放的行记录也是有硬性定义的,最多允许存放7992行记录。
InnoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,即作为行溢出数据。一般认为BLOB、LOB这类的大对象列类型的存储会把数据存放在数据页面之外。但是,这个理解有点偏差,BLOB可以不将数据放在溢出页面,而即使是varchar列数据类型,依然有可能存放为行溢出数据。

数据页结构:
页的组成结构如图:
这里写图片描述
File Header、Page Header、File Trailer的大小是固定的,用来标示该页的一些信息,如Checksum、数据所在索引层等。其余部分为实际的行记录存储空间,因此大小是动态的。

约束:
对于InnoDB存储引擎而言,提供了4种约束:
❑Primary Key
❑Unique Key
❑Foreign Key
❑Default
❑NOT NULL

外键:
InnoDB存储引擎则完整支持外键约束。我们称被引用的表为父表,另一个引用的表为子表。外键定义为,ON DELETE和ON UPDATE表示父表做DELETE和UPDATE操作时子表所做的操作。可定义的子表操作有:
❑CASCADE:当父表发生DELETE或UPDATE操作时,相应的子表中的数据也被DELETE或UPDATE。
❑SET NULL:当父表发生DELETE或UPDATE操作时,相应的子表中的数据被更新为NULL值。当然,子表中相对应的列必须允许NULL值。
❑NO ACTION:当父表发生DELETE或UPDATE操作时,抛出错误,不允许这类操作发生。
❑RESTRICT:当父表发生DELETE或UPDATE操作时,抛出错误,不允许这类操作发生。如果定义外键时没有指定ON DELETE或ON UPDATE,这就是默认的外键设置。
InnoDB存储引擎在外键建立时会自动地对该列加一个索引。

视图:
视图(View)是一个命名的虚表,它由一个查询来定义,可以当做表使用。与持久表(permanent table)不同的是,视图中的数据没有物理表现形式。
虽然视图是基于基表的一个虚拟表,但是我们可以对某些视图进行更新操作,其实就是通过视图的定义来更新基本表,我们称可以进行更新操作的视图为可更新视图,视图定义中的WITH CHECK OPTION就是指对于可更新的视图,更新的值是否需要检查。

参见《Mysql技术内幕+Innodb存储引擎》

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_30994081/article/details/79964264
个人分类: MySql
想对作者说点什么? 我来说一句

ASCII表ASCII表ASCII表ASCII表

2010年08月26日 33KB 下载

内存表 内存表 内存表 内存表

2010年11月23日 94KB 下载

mysql基本操作

2017年11月03日 5KB 下载

ASCII表ASCII表ASCII表

2009年03月06日 4KB 下载

学校资源 勤工助学表

2009年03月02日 34KB 下载

ACSII表 ACSII表 ACSII表

2010年09月12日 4KB 下载

没有更多推荐了,返回首页

不良信息举报

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭