首页 > 数据库 > 文库 > 正文

INNODB 页节点数据的存储方法

2024-09-07 22:12:50
字体:
来源:转载
供稿:网友
  前文:
  关于MYSQL INNODB index page header学习和实验总结
  http://blog.itpub.net/7728585/viewspace-2063921/
  关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究
  http://blog.itpub.net/7728585/viewspace-2065464/
 
  所用到的工具是自己写的mysqlblock和bcview,
  我放到了百度云盘
  http://pan.baidu.com/s/1num76RJ
  供大家下载和使用
  本文只讨论COMPACT行模式
 
  数据:
  mysql> select * from km1;
  +------+---------+
  | id   | name    |
  +------+---------+
  |    2 | gaopeng |
  |    4 | gaopeng |
  |    5 | gaopeng |
  |    6 | gaopeng |
  |    7 | gaopeng |
  |    8 | gaopeng |
  +------+---------+
  6 rows in set (0.04 sec)
 
  上一篇文章已经从infimum找到了第一行数据的偏移量
  为99+65=164
  同时取出了第一行数据:
  bcview km1.ibd 16 164 30|more
  current block:00000003--Offset:00164--cnt bytes:30--data is:000001cc64260000002d0272d300000d1201108000000267616f70656e67
  分解一下数据
  000001cc6426   ROWID
  0000002d0272   transaction id
  d300000d120110 roll pointer
  80000002       数据2,这里8出现在第15位,可能为符号位
  67616f70656e67 数据'gaopeng'的ascII值
 
  那么我们解析来介绍关于CLUSTER KEY-LEAF BLOCK的相关的部分
  很显然我这里的表只有一个块,因为数据很少。所以先介绍这个
  ,因为所谓的infimum的offset是指向的数据的开头,而行头信息
  记录在offset-N的位置,N不确定看了如下就知道了
 
 
             variable field lengths  (1-2 bytes* var )
             nullable field bitmap   (1 bit * null field)
             info flags              (4 bits)
             number of records owned (4 bits)
             order                   (13 bits)
             record type             (3 bits)
             next record offset      (2 bytes)
  offset ----cluster key fields      (N bytes)
             transaction id          (6 bytes)
             roll pointer            (7 bytes)
             non-key fields          (M bytes)
 
  1、variable field lengths
     每个可变长度的变量类型存储一个长度如varchar,对于固定长度的比如INT不记录。
     如果不存在可变长度的变量类型,至少占用一个字节为00。
  2、nullable field bitmap
     每个NULL值占用一个一位(bit),如果不满一个字节按一个字节算,如果不存在NULL值
     至少占用一个字节为00。
  3、info flags
     这4位(4bits)标示是一个行标识,其中binary 0001表示非叶节点最小的行
     其中binary 0010表示是删除的行,而infimum和supremum行在我测试数据库中为binary 0000
  4、number of records owned
     这4位(4bits)表示在本page directory(槽)中的记录数,关于槽的概念后面详细探讨
  5、order
     这13位(13bits)表示记录插入到块中顺序,INFIMUM恒等于0而SPREMUM恒等于1,而数据行的ORDER从2开始,这里的order
     我实验得出的结论为实际物理空间的顺序
  6、record type
     这3位(3bits)表示记录的类型,supermum恒等于3及binary 011,infimum恒等于2及binary010,节点指针为1及001,数据行为000
  7、next record offset
     这2个字节是按照CLUSTER KEY值排序的,也就是说他的顺序和order没有任何联系,order是插入的顺序
     在INFIMUM中表示的是第一个行的偏移量这个偏移量是当前记录的位置+offset,这个offset直接指向了数据而相关的行头在offset-n开始n为行头的开销。
     当然supermum为的偏移量就是NULL空指针了。
  8、cluster key fields
     这N个字节代表主键字节数,没有就是ROWID占用6字节
  9、transaction id
     这6个字节为最后一次修改本行的事物ID
  10、roll pointer
      这7个字节是用于支持MVCC多版本的回退指针,
      1bit 标识
      7bit 回退段ID
      4bytes 回滚段页号
      2bytes 回滚段页的偏移量
     这几位在讨论MVCC的时候详细研究
  11、non-key fields
      也就是M个字节的非主键字段的数据了。
 
  同样分解数据
  07
  00
  0
  0
  0020       这里分解同上 0000 0000 0010 0=十进制4 这是order 表示这个数据在上条数据插入之前,但是OFFSET是按照ROWID排序的。
  ffb6       任然是补码的方式 实际就是-74
  000001cc6500
  0000002d062bab
  00000d0c0110
  80000005   实际数据5
  67616f70656e67 实际数据'gaopeng'

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表