MySQL--表
其他
2018-06-09 10:12:46
阅读次数: 2
-
索引组织表
-
定义:在innodb存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表。
-
在innodb存储引擎表中,每张表都有一个主键
-
如果在创建表的过程中,没有显示的定义主键,则innodb存储引擎会按照如下方式选择或创建主键:
-
当表中有多个非空唯一索引时,innodb存储引擎将选择建表时定义的第一个定义的非空唯一索引为主键,注意:主键的选择根据的是定义索引的顺序,而不是建表时列的顺序;
-
innodb逻辑存储结构
-
innodb行记录格式
-
compact
-
存储方式:
-
变长字段长度列表:null标志位:记录头信息:列1数据:列2数据:.......
-
compact行记录格式的首部是一个非null变长字段长度列表,按照列的顺序逆序放置其长度为
-
null标志为:
-
记录头信息:固定占用5字节(40位)。每列含义如下:
-
() 1 未知
-
() 1 未知
-
deleted_flag 1 该行是否已经删除
-
min_rec_flag 1 为1,如果该记录是预先定义为最小的记录
-
n_owned 4 该记录拥有的记录数
-
heap_no 13 索引岁中该条记录的排序记录
-
record_type 3 记录类型,000表示普通,001表示B+Tree树节点指针,010表示infimum,011表示 supermum,1xx标出保留
-
next_record 16 页中下一条记录的相对位置
-
total 40
-
不管是char类型,还是varchar类型,在compact格式下null值都不占用任何存储空间
-
一个页中存放的数据越多,其性能就越高
-
redundant
-
行溢出数据
-
compressed和dynamic行记录格式
-
以上的文件格式(compact和redundant)称为antelope文件格式,新的文件格式称为barracuda文件格式,barracuda文件格式拥有两种新的行记录格式,compressed和dynamic;
-
新的行记录格式对于存放在blob中的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际的数据都存放在off page 中。
-
compressed的另一个功能就是,存储在其中的行数据会以zlib算法进行压缩。
-
char的行结构存储
-
innodb数据页结构
-
innodb数据页由以下7部分组成:
-
-
file header(文件头)-------------38字节
-
-
page header(页头)-------------56字节
-
-
infinimum和supermum records
-
在innodb存储引擎中,每个数据页中有两个虚拟的行记录,用来限定记录的边界;
-
infimum记录是比该页中任何主键值都要小的值,supermum指比任何可能大的值还要大的值;
-
这两个值在页创建的时候被建立,并且在任何情况下都不会被删除;
-
在compact和redundant行格式下,两者占用的字节数各不相同
-
user records(用户记录,即行记录)
-
free space
-
page directory(页目录)
-
page directory中存放了记录的相对位置(注意,这里存放的是相对位置,不是偏移量),有些时候这些记录的指针称为slots(槽)或目录槽(dirctory slots);
-
innodb存储引擎的槽是一个稀疏目录,即一个槽中可能包含多个记录;
-
B+Tree索引本身并不能找到具体的一条记录,能够找到的只是该记录所在的页,数据库把页载入到内存中,然后通过page directory在进行二叉查找,只不过二叉查找的时间复杂度很低,同时在内存中的查找很快,因此通常忽略这部分查找所用的时间。
-
file trailer(文件结尾信息)--------8字节
-
为了检测页是否已经完整的写入磁盘,innodb存储引擎页中设置了file trailer部分;
-
file trailer 只有一个fil_page_space_end_lsn部分,占用8字节,前4字节代表该页的checksum值,最后4字节和fiile header中的fil_page_lsn相同。将这两个值与file header中的fil_page_space_or_chksum和fil_page_lsn值进行比较,看是否一致,以此来保证页的完整性。
-
约束
-
数据完整性
-
一般来说,数据完整性有以下三种形式:
-
实体完整性保证表中有一个主键。在innodb存储引擎表中,用户可以通过定义primary key或unique key约束来保证实体的完整性。用户还可以编写触发器来保证数据完整性;
-
域完整性保证数据每列的值满足特定的条件,在innodb存储引擎中,域完整性可以通过以下几种途径保证;
-
参照完整性保证两个表之间的关系,innodb存储引擎支持外键,因此允许用户定义外键以强制参照完整性,也可以通过触发器强制执行
-
约束类型
-
primary key
-
foreign key
-
unique key
-
default key
-
not null
-
约束的创建和查找
-
方式:
-
表建立时就立即约束定义;
-
利用alter table命令来进行创建约束
-
约束和索引的区别
-
enum和set约束
-
触发器与约束
-
外键约束
-
视图
-
分区表
-
分区概述:
-
mysql支持的分区类型为水平分区,并不支持垂直分区
-
mysql数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引;
-
全局分区是指:数据存放在各个分区中,但是所有数据的索引放在一个对象中,mysql5.6不支持全局分区
-
分区类型:
-
range分区:行数据基于属于一个给定连续区间的列值被放入分区
-
list分区:和range分区类似,list分区面向的离散的值
-
hash分区:根据用户自定义的表达式的返回值来进行分区
-
key分区:根据mysql数据库提供的hash函数来进行分区
-
columns分区
-
注意:不论创建何种类型的分区,如果表中存在主键或唯一索引,分区列必须是唯一索引的一个组成部分;
-
唯一索引可以是允许null值的,并且分区列只要是唯一索引的一个组成部分,不需要整个唯一索引都是分区列;
-
如果建表时没有指定主键,唯一索引,可以指定任何一个列为分区列
-
子分区
-
子分区是在分区的基础上再进行分区,有时也称这种分区为复合分区
-
mysql允许在range分区和list分区的基础上再进行hash或key分区
-
注意:
-
子分区可以用于特别大的表,在多个磁盘间分别分配数据和索引。由于innodb使用表空间自动地进行数据和索引的管理,因此会忽略data directory和index directory 语法。
-
分区中的null值
-
mysql数据库允许对null值做分区,mysql数据库的分区总是视null值小于任何一个非null值,因此对于不同的分区类型,mysql数据库对于null值 的处理方式也是不一样的
-
range分区:mysql会将null值放入最左边的分区,删除分区时也会一并将null值记录删除;
-
list分区:在list分区下使用null值,必须显式地指出哪一个分区中放入null值,否则报错;
-
hash分区和key分区:任何分区函数都会将含有null值的记录返回为0;
-
在表和分区间交换数据
-
alter table ... exchange partition语法
-
允许分区或子分区中的数据与另一个非分区的表中的数据进行交换;
-
如果非分区表中的数据为空,相当于将分区的数据移动到非分区表中
-
若分区表的数据为空,相当于将外部表的数据导入到分区表中
-
使用上述语句必须满足如下条件:
-
要交换的表和分区表有着相同的表结构,但是表不能含有分区
-
在非分区表中的数据必须在交换的分区定义内
-
被交换的表中不能含有外键,或者其他的表含有对该表的外键引用
-
用户除了需要alter、insert、create权限外,还需要drop权限
-
注意;
-
使用该语句时,不会触发交换表和被交换表上的触发器
-
auto_increment列将被重置
-
分区并不总是适用于OLTP应用
转载自www.cnblogs.com/ykyk1229/p/9158425.html