230_mysql_binlog结构组成(mysql binlog详解)
527
2022-05-28
前言;
1 Innodb 核心特性
MVCC : 多版本并发控制
聚簇索引 : 用来组织存储数据和优化查询
支持事务 : 数据最终一致提供保证
支持行级锁 : 并发控制, 保障 写 – 写之间的控制,保障一致性
外键 : 多表之间的数据一致一致性 多缓冲区支持
自适应Hash索引: AHI 复制中支持高级特性。
备份恢复: 支持热备。
自动故障恢复:CR Crash Recovery
双写机制 : DWB Double Write Buffer
2 查询版本
#客户端版本 Mysql -V #server 版本 select @@version; engine 版本: SELECT * FROM information_schema.plugins; SELECT @@innodb_version;
一 宏观结构
8.0 以前 InnoDB表: ibd数据和索引; frm :存私有的数据字典信息; ibdataN:系统的数据字典信息
8.0 之后只有ibd数据和索引+ 冗余的SDI私有数据字典信息 (对DDL有好处) SDI(每个表的表空间自行管理json格式的私有数据字 典信息,用来替换frm的。)
mysql.ibd ---> 整个系统的数据字典,不再放在ibdata1
二 微观物理结构
2.1 innodb记录存储结构
Innodb数据页16KB (show variables like "innodb_page_size"; #16384 16KB) 一次至少从磁盘读取16KB到内存,一次最少刷新16KB内容到磁盘
2.2 Innodb 行格式 Row_Format (Redundant Compact Dynamic Compressed)
show variables like "%Row_Format%" # innodb_default_row_format dynamic create table xxx() ROW_FORMAT=DYNAMIC
2.3 行格式的机构
1 记录额外的信息 (132字节)
变长字段长度信息: 列表形式 存储所有可变长度字段(varchar TEXT)的真实数据(非NULL)占用的字节数 (逆序存放)
NULL值列表: 二进制表示 1为null,0位非null (先判断表约束,然后根据实际情况 逆序存放 最终转成16进制)
记录头信息:5个字节(40个二进制位)组成 描述该记录的属性
名称
大小(bit)
没有使用
没有使用
标记该记录是否被删除,0 表示未删除,1表示删除,
B+树的每层非叶子节点中的最小记录都会添加该标记 (只有目录项_非叶子节点存储此信息 1 表示,其它是0)
表示当前记录拥有的记录组数 带头大哥的组数为实际组数,小弟为0
表示当前记录在记录堆的位置信息 (user records中heap一条条亲密无间排列的结构,每条记录在heap中的位置heap_no)
表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点(目录项)记录,2表示Infimum最小记录,3表示Supermum最大记录
表示下一条记录的相对位置
备注:
记录可以比大小,比的是主键
无论插入多少条记录,最小是Infimum (5字节记录头+8字节固定单词), 最大是Supremum
Next record 当前记录到下一条记录的真实距离(理解为偏移量/指针 正数代表在下一条记录后面,负数代表前面, -111代表向前找111个字节)
无论对数据的增删改,innodb始终维护一个单项链表(链表各个节点由主键从小到大顺序链接)
页面前面的记录heap_no小,后面大,从2开始, 0-Infimum;1-Supremum最靠前
2 真实记录数据
Row_id 6字节 ,行ID 唯一表示一条记录 非刚需,无主键情况下生成(无显示定义,可以选not null & UNIQUE的键)
Trx_id 6 字节 事物ID 刚需
Roll_pointer 7字节 回滚指针
溢出列
某列超出数据页范围 需在其他页面存储,其它页面即为溢出列(COMPACT&REDUNDANT格式 会存储真实记录的 768字节,再拿20字节存储其它位置的指针等信息)
溢出页临界点(MySQL中规定,一个也至少存两行记录 每行记录真实数据的属性信息27字节) 132+2(27+n)< 16384 , n <8099 情况下不会有溢出列
DYNAMIC格式不会单独记录真实数据的前768个字节,仅拿20字节存储溢出页/列的位置
三 Innodb数据页结构
InnoDB存放不同数据页设计不同类型的页, 例如 index 页 Change buffer页,Inode页,undo页, 通用结构如下
3.1 Page Directory
Select * from xxx where id = xxx不会从infimum开始遍历,innodb会设计一种 类似书的目录结构,
将正常记录分成几组(包括infimum & supremum)
每组最后一条也是最大记录是带头大哥,其余数据属于这位大哥(n_owned=0)
带头大哥在页面中的偏移量(实际位置到第0个字节距离)取出,放在整改页的尾部(page directory) 这些偏移量成为槽 slot(每个slot2字节,相邻分布,越小越接近File Trailer)
Infimum所在组只能有1条记录,supremum所在组 1-8条, 剩下正常组 4-8条
3.2 PageHeader 记录数据页中的状态信息 例如 Free space 偏移量,slot个数等
3.3 File header (文件头部信息 记录数据页记录的各种状态)
当MySQL版本小于MySQL-4.0.14,该值代表该页所在表空间ID ,之后该值代表页的checksum值(一种新的checksum值)。
页号 (单独页号类似身份证)
上一个页号 双向链表
下一个页号 B+Tree特性决定了叶子节点必须是双向列表
页面最后被修改后修改时候的LSN(Log Sequence Number)
该值仅在系统表空间的第一页中定义,代表文件至少被更新到了该LSN值
该值代表页属于哪个表空间
数据页类型
类型名称
十六进制
描述
FIL_PAGE_TYPE_ALLOCATED
0x0000
最新分配,还没使用
FIL_PAGE_UNDO_LOG
0x0002
Undo 日志页
FIL_PAGE_INODE
0x0003
存储断的信息
FIL_PAGE_IBUF_FREE_LIST
0x0004
Change Buffer空闲列表
FIL_PAGE_IBUF_BITMAP
0x0005
Change Buffer 的一些属性
FIL_PAGE_TYPE_SYS
0x0006
存储一些系统数据
FIL_PAGE_TYPE_TRX_SYS
0x0007
事务系统数据
FIL_PAGE_TYPE_FSP_HDR
0x0008
表空间头部信息
FIL_PAGE_TYPE_XDES
0x0009
扩存储区的一些属性
FIL_PAGE_TYPE_BLOB
0x000A
溢出页
FIL_PAGE_INDEX
0x45BF
索引页,也就是数据页
3.4 File Trailer (文件尾部) 为了检测页是否已经完整地写入磁盘(如可能发生的写入过程中磁盘损坏、机器关机等)
8个字节组成 分成2部分
前四个字节 代表也的校验和 通File Header中的校验和对应
后四个字节 代表页面被最后修改时 对应的LSN的后四个字节 同FILE_PAGE_LSN后四个字节相同
四 Innodb存储引擎索引_B+树索引
表在插入过程中,分配的数据页不一定是连续的,由于主键索引从小到大排序,所以会有页的分裂产生,为了快速查找,制作目录(非叶子节点)
页的用户记录中最小的主键值 作为key
页号 用page_no 表示
B+ 树的根节点自创建日后不再移动
聚簇索引 主键的大小作为页和记录的排序规则, 叶子节点记录包含表中所有列
二级索引(辅助索引) 索引列(字段)的大小作为页和记录排序规则, 叶子节点存储的是索引列和主键
MyISAM 存储引擎的数据和索引分开存储, 索引均为二级索引,叶子节点存储的是列+行号
4.1 聚簇索引 使用主键的大小作为页和记录的排序规则
页(包括叶子节点和内节点) 内的记录安装主键大小排序 –> 单向链表
各存放用户记录的页节点也根据用户记录的主键大小排序 –> 双向链表
存放目录项的页 层级不同,同层级中页也是根据目录项的主键大小排序 –>双向链表
B+树的叶子节点存储完整用户记录包括隐藏列
4.2 二级索引 单独一颗B+数 叶子节点存储列和主键ID以及页号
如果联合索引a1 a2 a3 会先按a1排序,a1相同a2排序,a2相同a3排序, 再对应主键(顺序打乱,随机IO)
创建索引
alter table t1 add index idx_k2(k2);
alter table t1 add index idx_k1_2(k1,k2);
alter table city add index idx_n(name(5)); # 前置索引
alter table city drop index idx_n
MySQL 数据结构
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。