innodb_ruby 研究innodb 的存储结构

2022-08-02 19:05:09 浏览数 (1)

下载工具

https://github.com/jeremycole/innodb_ruby

导入测试数据

https://github.com/xiazemin/-innodb_ruby_study

注意不支持mysql 8.0

安装mysql 5.7

切换到mysql的数据存储目录

cd /usr/local/var/mysql5.7/

代码语言:javascript复制
innodb_space -s ibdata1 -T zeno3376/t2 space-page-type-regions
start end count type 
0 0 1 FSP_HDR
1 1 1 IBUF_BITMAP
2 2 1 INODE
3 17 15 INDEX
18 18 1 FREE (ALLOCATED)
  • start:从第几个page开始     
  • end:从第几个page结束     
  • count:占用了多少个page;    
  • type: page的类型 对于InnoDB表空间来说,表空间是有多个区组成的。其中的每个区都由物理位置上连续的64个页组成,因为每个页的大小为16K,所以一个区的大小是1M。

区太多了就难以管理了,所以每256个区组成一个组,按组管理。

1、HSP_HDR类型页

表空间的第一个组的第一个区的第1页是FILE_PAGE_TYPE_FSP_HDR类型页,简称FSP_HDR类型页。

FSP_HDR类型页的file space header部分存储了整个表空间的一些属性和5个链表基节点。

前3个链表基节点是表空间中碎片区对应的XDES Entry结构构成的3个链表的基节点。

后2个链表基节点是表空间中段(Segment)对应的INODE结构所在的INODE页构成的2个链表的基节点。

链表基节点的大小为16字节。

(2)FSP_HDR类型页的XDES Entry部分存储了本组的256个区对应的XDES Entry结构。

2、IBUF_BITMAP类型页

表空间的每个组的第一个区的第2页是FILE_PAGE_IBUF_BITMAP类型页,简称IBUF_BITMAP类型页。

存储本组所有的区的所有页面INSERT BUFFER的信息。

3、INODE类型页

表空间的第一个组的第一个区的第3页是FILE_PAGE_INODE类型页,简称INODE类型页。

(1)INODE类型页的List Node for INODE Page List部分存储了其他INODE类型页面的页号和偏移,构成了链表,总共构成2个链表,链表的基节点就在上面说的HSP_HDR类型页file space header部分的后两个链表基节点。

(2)INODE Entry部分存储了表空间的所有段对应的INDODE Entry结构。

4、XDES类型页

表空间的每个组(除第一组)的第一个区的第1页是FILE_PAGE_TYPE_XDES类型页,简称XDES类型页。

XDES类型页和HSP_HDR类型页基本一致,XDES类型页其实就是HSP_HDR类型页file space header部分为空。

5、Data dictionary Header

系统表空间的第一个组的第一个区的第8页是FILE_PAGE_TYPE_SYS类型页,简称SYS类型页,它记录了Data dictionary Header。

(1)Data Dictionary Header部分存储了基本系统表(basic system tables)的索引的根节点的信息(图中绿色)和一些全局的自增变量。

代码语言:javascript复制
innodb_space -s ibdata1 -T zeno3376/t2 -p 3 page-records 
Record 126: (id=1782) → #5 Record 140: (id=1890) → #6

1行就代表使用了1个page,所以,叶子节点共使用了9个page,根节点使用了1个page

  • id = 1782 代表的就是表中id为1782的记录,因为id是主键
  • -> #5 代表的是指向5号page
代码语言:javascript复制
innodb_space -s ibdata1 -T zeno3376/t2 -p 5 page-records 
Record 128: (id=1782) → (name=”zeno”, remark=”mysql”, add_time=:NULL) 
Record 162: (id=1783) → (name=”KIK91QJET1FCZ46EJKML”, remark=”H4HJO5F7W5GSSDORT8AAT”, add_time=”184524556-49-63 92:14:08”)

查看record 详细信息

代码语言:javascript复制
innodb_space -s ibdata1 -T zeno3376/t2 -p 5 -R 7444 record-dump 



Record at offset 7444

Header:
  Next record offset  : 112
  Heap number         : 109
  Type                : conventional
  Deleted             : false
  Length              : 8

System fields:
  Transaction ID: 1296
  Roll Pointer:
    Undo Log: page 290, offset 1556
Rollback Segment ID: 46
Insert: true

Key fields:
id: 1889

Non-key fields:
name: "0O2S6OCUC99MQKM1"
  remark: "1K5GJEQ5QU83T3F"
  add_time: "184524556-52-49 32:71:04"

参考

https://xiazemin.github.io/MyBlog/storage/2021/03/14/innodb_ruby.html

0 人点赞