- Innodb存储结构
- 段
- 区
- 页/块
- 页的结构
- 行
- 行的结构
- 视图
- 分区表
4.1 组织索引表
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,存放的表称为索引组织表。在InnoDB存储引擎表中,每张表都有个主键,如果创建表时没有显示定义主键,InnoDB会按如下方式隐示选择或创建主键
- 首先判断表中是否有非空的唯一索引。如果有,选其为主键(如果有多个,选第一个)
- 如果不符合上述条件,InnoDB存储引擎会自动创建一个6字节大小的指针
4.2 Innodb存储结构
从Innodb的逻辑存储结构看,所有数据都被逻辑地存放在一个空间里,称为表空间(tablespace)。表空间由以下组成
- 段(segment):对于Innodb来说可分为:数据段(叶子节点)+索引段(非叶子节点)+回滚段
- 区(extent):在任何情况下每个区的大小都为1MB。默认情况下,一个页16KB,一个区=64个连续页
- 页 / 块(page/block):一般16K,常见的有:数据页+undo页+系统页+事务页...
- 行(row):Compact和Redundant两种格式,后者多用于5.0之前
(1)页的结构
File Header 文件头 | 表空间相关信息,38字节 |
|
Page Header 页头 | 记录当前页的信息,56字节 |
|
Infimum + Supremum Records | 最大,最小记录 |
|
User Records | 用户记录 |
|
Free Space | 空闲空间 | |
Page Directory | 数据目录 |
|
File Trailer | 文件结尾信息,8字节 |
|
(2)行的结构
- Compact:5.0后引入,压缩格式便于让一个页存放更多行数据
格式:
- Redundant:5.0之前的存储方式,现在还支持该格式是为了兼容
4.2 视图
本质上是一种虚拟表,在物理上是不存在的。在具体引用视图时(本质是定义好的查询)动态生成视图。
-
视图的建立和删除不影响基本表。
-
对视图内容的更新(添加,删除和修改)直接影响基本表。
作用:看起来方便(简化操作)+ 数据安全
4.3 分区表
- MYSQL数据库支持水平分区,并不支持垂直分区。
- 并且是局部分区索引(数据和索引一起分区)而非全局分区(数据分区,索引仍在一起)
- 如果表中存在主键或唯一索引:分区列必须是唯一索引的一个组成部分
- 如果表中没有指定主键和唯一索引:任意列都能为分区列
- 对于NULL值:RANGE会放入最左边的分区;LIST需要显示指出哪个分区放入NULL值,不然会报错;HASH和KEY会把NULL值的记录返回为0
1. RANGE分区:一个连续区间
2. LIST分区:离散区间
注:在INSERT插入多个行数据遇到未分区的值时,MyISAM会将之前的行数据都插入成功,之后的不会插入;Innodb因为存在事务,因此没有任何数据插入
3. HASH分区:用户自定义表达式
注:还有LINEAR HASH,增加删除合并拆分更高效,但数据分布没有那么均衡
4. KEY分区:Mysql提供的哈希函数,不需要自己提供函数
5. COLUMNS分区:针对非整型的数据
6. 子分区:MYsql允许在RANGE和LIST的分区上再进行HASH或KEY的子分区
分区并不是都有效的。