索引组织表:
在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
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭