4.1 Innodb存储结构
段区页/块 页的结构行 行的结构4.2 视图
4.3 分区表
段:对于Innodb来说可分为:数据段(叶子节点)+索引段(非叶子节点)+回滚段
区:在任何情况下每个区的大小都为1MB。默认情况下,一个页16KB,一个区=64个连续页
页:常见的有:数据页+undo页+系统页+事务页...
行:Compact和Redundant两种格式,后者多用于5.0之前
(1)页的结构
File Header 文件头表空间相关信息,38字节1.页的checksum
2.该页在文件中的偏移量编号/第几页
3.前后指针指向前面后面的页
4.当前数据页最新被修改的LSN,用于redolog
5.当前页面是哪种类型的数据页
Page Header 页头记录当前页的信息,56字节1.目录个数/slot个数
2.各种页中的地址指针
数据头指针,指向数据页中的空闲空间的起始地址空闲地址头指针最后插入的位置指针3.页中记录的数量
4.当前页在索引树中的位置
5.索引ID,当前页属于哪个索引
Infimum + Supremum Records最大,最小记录边界:infimum<最小的key,supremum>最大的keyUser Records用户记录记录所有数据,非连续物理地址。靠单项链表维护Free Space空闲空间 Page Directory数据目录数据库把页加载进内存通过page directory进行二叉查找。
里面存放地址偏移量,也叫slot槽
每个页的目录个数在【4,8】,平均6条
File Trailer文件结尾信息,8字节检测页是否已经完整写入磁盘
checksum
(2)行的结构
Compact:5.0后引入,压缩格式便于让一个页存放更多行数据
格式:
Redundant:5.0之前的存储方式,现在还支持该格式是为了兼容
本质上是一种虚拟表,在物理上是不存在的。在具体引用视图时(本质是定义好的查询)动态生成视图。
视图的建立和删除不影响基本表。
对视图内容的更新(添加,删除和修改)直接影响基本表。
作用:看起来方便(简化操作)+ 数据安全
MYSQL数据库支持水平分区,并不支持垂直分区。
并且是局部分区索引(数据和索引一起分区)而非全局分区(数据分区,索引仍在一起)。
如果表中存在主键或唯一索引:分区列必须是唯一索引的一个组成部分
如果表中没有指定主键和唯一索引:任意列都能为分区列
对于NULL值:RANGE会放入最左边的分区;LIST需要显示指出哪个分区放入NULL值,不然会报错;HASH和KEY会把NULL值的记录返回为0
(1)分区类型
1. RANGE分区:一个连续区间
2. LIST分区:离散区间
注:在INSERT插入多个行数据遇到未分区的值时,MyISAM会将之前的行数据都插入成功,之后的不会插入;Innodb因为存在事务,因此没有任何数据插入
3. HASH分区:用户自定义表达式
注:还有LINEAR HASH,增加删除合并拆分更高效,但数据分布没有那么均衡
4. KEY分区:Mysql提供的哈希函数,不需要自己提供函数
5. COLUMNS分区:针对非整型的数据
6. 子分区:MYsql允许在RANGE和LIST的分区上再进行HASH或KEY的子分区
分区效率
分区并不是都有效的。