MySQL Internal - InnoDB存储引擎(行结构)
InnoDB行存储的三个组成部分(说明: F字符表示列的数量)
名称(Name) | 大小(Size) |
Field Start Offsets | (F*1) or (F*2) bytes |
Extra Bytes | 6 bytes |
Field Contents | 取决于内容 |
1: FIELD START OFFSETS
指在实际数据存储行中每一字段(entry,实际存储不只是包括列,还有额外信息)的位置偏移量信息列表,这个位置由原点(Origin)相对位置和下一个字段计算而来。该列表保存的行中每一字段的偏移信息为倒序的,也就是说行中第一字段信息在这个列表的最后。
举个例子:假设有三个列,第一个列的长度为1字节,第二个为2字节,第三个为4字节,这种情况下,保存三个列的偏移信息分别为[1,3(1+2),7(1+2+4)],列表倒序,转储的Field Start Offsets的信息应该为[07,03,01].
有两种的特殊复杂情况:
1:偏移量数字可能为一个或两个字节,一个字节最多允许长度为127,最高位bit用来保存是否为NULL,"Extra Bytes"部分说明了偏移量为一个字节还是两个字节。
2:偏移量可能有一个标志信息,剩下的字节空间包含两个段,指具体的内容。(可能这些内容并不在同一个页中,参考后面的分析)
当偏移量为一个字节时:
1 bit = NULL
7 bit, 实际的偏移信息
当偏移量为两个字节时:
1 bit = NULL
1 bit = 0 内容在同一个页中,= 1 内容在不同的页中
14 bits = 实际的偏移量,0 ~ 16383
2:EXTRA BYTES
Extra Bytes为6个字节
Name | Size | Description |
info_bits: | ?? | ?? |
() | 1 bit | 未使用 |
() | 1 bit | 未使用 |
deleted_flag | 1 bit | 1:删除标志位(已删除) |
min_rec_flag | 1 bit | 1: 预定义的最小记录 |
n_owned | 4 bits | 拥有的记录数量 |
heap_no | 13 bits | 堆块中索引的数据页序列编号 |
n_fields | 10 bits | 记录中的字段数量 1 to 1023 |
1byte_offs_flag | 1 bit | 1:Field Start Offsets为一个字节,否则为两个字节 |
next 16 bits | 16 bits | 下一个记录的指针(System Column #1) |
TOTAL | 48 bits | ?? |
共48 bit,6个字节
如果需要通过字节读取这存储的记录,最关键的需要读取Extra Bytes 中的byte_offs_flag位信息,需要知道1表示偏移信息为一个字节,0表示两个字节
如果给定了一个相对原点(Origin),InnoDB获取记录开始遵循如下步骤:
-- X = n_fields,这个数字等于Field Start Offsets列表中的定义的数量
-- 如果byte_offs_flag = 0,X = X * 2,每个偏移量为两个字节表示的
-- X = X + 6,固定大小的Extra Bytes为6字节
-- 记录的开始位置当前的位置减去X
(参照FIELD CONTENTS)
3:FIELD CONTENTS
Field Contents部分包括了记录的所有数据,这些字段按照我们预定义的方式按顺序存储。
字段与字段没有任何标记,记录的结尾也没有任何标志。
实例:
-- 创建一张表
CREATE TABLE T
(FIELD1 VARCHAR(3), FIELD2 VARCHAR(3), FIELD3 VARCHAR(3))
Type=InnoDB;
需要知道的是,InnoDB下表中的每一行有6个字段,并不是3个,因为InnoDB在存储的内容前自动补充的3个列("system columns"),这些列分别为 行ID(row ID,该表未定义主键),事务ID(transaction ID), 回滚指针(rollback pointer)。
-- 为该表增加三条数据
INSERT INTO T VALUES ('PP', 'PP', 'PP');
INSERT INTO T VALUES ('Q', 'Q', 'Q');
INSERT INTO T VALUES ('R', NULL, NULL);
运行工具(Borland's TDUMP)查看二进制的事务文件信息(\mysql\data\ibdata1
)
Address Values in Hexadecimal |
Values in ASCII |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
做一下格式处理,添加标记:
19 17 15 13 0C 06 Field Start Offsets /* First Row */
00 00 78 0D 02 BF Extra Bytes
00 00 00 00 04 21 System Column #1
00 00 00 00 09 2A System Column #2
80 00 00 00 2D 00 84 System Column #3
50 50 Field1 'PP'
50 50 Field2 'PP'
50 50 Field3 'PP' 16 15 14 13 0C 06 Field Start Offsets /* Second Row */
00 00 80 0D 02 E1 Extra Bytes
00 00 00 00 04 22 System Column #1
00 00 00 00 09 2B System Column #2
80 00 00 00 2D 00 84 System Column #3
51 Field1 'Q'
51 Field2 'Q'
51 Field3 'Q' 94 94 14 13 0C 06 Field Start Offsets /* Third Row */
00 00 88 0D 00 74 Extra Bytes
00 00 00 00 04 23 System Column #1
00 00 00 00 09 2C System Column #2
80 00 00 00 2D 00 84 System Column #3
52 Field1 'R'
-- "Field Start Offsets"
参照First Row,从Extra Bytes开始的7个字段,大小分别为6, 6, 7, 2, 2, 2,偏移信息指向了下一字段的开始位置,16进制表示下的数字06, 0c (6+6), 13 (6+6+7), 15 (6+6+7+2), 17 (6+6+7+2+2), 19 (6+6+7+2+2+2),倒序的Field Start Offsets值分别为:[19,17,15,13,0c,06]
-- "Extra Bytes"
参照First Row,Extra Bytes为[00 00 78 0D 02 BF],参照EXTRA BYTES读取跳过头21 bit读(n_fields),取10个bit,读取第三个字节最后三个个bit [000]和
第四个字节0D[00001101]的7个bit [0000110],得出的6即为字段的数量(除去Extra Bytes),第四个字节0D[00001101]最后bit:1表示byte_offs_flag说明偏移量为1字节,最后的第5,6字节
02 BF,指向下一行Second Row(System Column #1)的记录(
02BF为
),下一记录指向了System Column #1,读取过程遵循EXTRA BYTES末的规则。0D42BF页内地址
-- NULL列的表示
参照Third Row,FIELD2和FIELD3为NULL,因为byte_offs_flag为1,因此,在Field Start Offsets中[94 94 14 13 0C 06]每次读取1个字节可表示字段的偏移信息,这个字节最高位为NULL标记,14 13表示1个字节[52]的FIELD1值'R',94 14表示0字节的FIELD2值NULL(94最高位为1表示NULL,其余7 bit为14),94 94表示0字节的FIELD3值NULL。
MySQL Internal - InnoDB存储引擎(行结构)的更多相关文章
- mysql中InnoDB存储引擎的行锁和表锁
Mysql的InnoDB存储引擎支持事务,默认是行锁.因为这个特性,所以数据库支持高并发,但是如果InnoDB更新数据的时候不是行锁,而是表锁的话,那么其并发性会大打折扣,而且也可能导致你的程序出错. ...
- MySQL数据库InnoDB存储引擎多版本控制(MVCC)实现原理分析
文/何登成 导读: 来自网易研究院的MySQL内核技术研究人何登成,把MySQL数据库InnoDB存储引擎的多版本控制(简称:MVCC)实现原理,做了深入的研究与详细的文字图表分析,方便大家理解I ...
- MySQL数据库InnoDB存储引擎中的锁机制
MySQL数据库InnoDB存储引擎中的锁机制 http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能 ...
- MySql中innodb存储引擎事务日志详解
分析下MySql中innodb存储引擎是如何通过日志来实现事务的? Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据 ...
- mysql之innodb存储引擎
mysql之innodb存储引擎 innodb和myisam区别 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>. ...
- MySQL数据库InnoDB存储引擎
MySQL数据库InnoDB存储引擎Log漫游 http://blog.163.com/zihuan_xuan/blog/static/1287942432012366293667/
- mysql之innodb存储引擎---数据存储结构
一.背景 1.1文件组织架构 首先看一下mysql数据系统涉及到的文件组织架构,如下图所示: msyql文件组织架构图 从图看出: 1.日志文件:slow.log(慢日志),error.log(错误日 ...
- 在MySQL的InnoDB存储引擎中count(*)函数的优化
写这篇文章之前已经看过了很多数据库方面的优化内容,大部分都是加索引.使用事务.要什么select什么等等.然而,只是停留在阅读的层面上,很少有实践,因为没有遇到真实的项目,一切都是纸上谈兵.实践是检验 ...
- MySQL:InnoDB存储引擎的B+树索引算法
很早之前,就从学校的图书馆借了MySQL技术内幕,InnoDB存储引擎这本书,但一直草草阅读,做的笔记也有些凌乱,趁着现在大四了,课程稍微少了一点,整理一下笔记,按照专题写一些,加深一下印象,不枉读了 ...
随机推荐
- Unable to load dll 的解决方案
前几天在做项目时,需要用到一个非托管的 dll 库,其实使用 .Net 的互操作技术可以很方便地调用非托管 dll 文件中的函数,但是在执行时出现了“Unable to load dll HRESUL ...
- 关于mysql存储过程的definer的问题
由于对mysql了解不够透彻,导致对definer问题查了好久才解决问题 记录自己的一些理解! 问题描述: 在数据库写,为一个表写了一个触发器,此触发器调用一个存储过程:由公司写的一个c程序自动往该表 ...
- [置顶] Linux信号相关笔记
最近又温习了一遍Linux中的信号知识,发现有很多东西以前没有注意到,就通过这篇博客记录一下,巩固一下知识点. 一,信号基础: 信号是什么?为了回答这个问题,首先要从异常说起,这里的异常不是指c++/ ...
- Linux 调节屏幕亮度
intel的核心显卡驱动是在 /sys/class/backlight/intel_backlight/ 目录下面的brightness文件中配置的. 可以通过查看max_brightness的值来确 ...
- 圣杯VS双飞翼
双飞翼: <!DOCTYPE html> <html> <head> <title>推荐封面</title> <meta name=& ...
- 在Button的click事件中引起客户端JavaScript
void action1_Execute(object sender, SimpleActionExecuteEventArgs e) { WebWindow.CurrentRequestWindow ...
- ActionBar PopuMenu
PopupMenu popupmenu可以非常方便得实现在指定view下弹出一个菜单,实现类似ActionBar中的效果. public void showPopupMenu(View view){ ...
- 常见错误:Apple Mach-O Linker Error
常见错误描述: Apple Mach-O Linker Error这类错误的错误信息最后一行通常如下: Command /Developer/Platforms/iPhoneOS.platform/D ...
- java连接mysql批量写入数据
1.采用公认的MYSQL最快批量提交办法 public void index() throws UnsupportedEncodingException, Exception { //1000个一提交 ...
- or1200下raw-os学习(任务篇)
这次就来说说基于上一节介绍的系统框图去建立我们所需要的任务,顺便学习Raw-OS提供的API,根据上节的分析,对于Slave Board有如下设计: Slave Board有三个任务,分别负责测试阻抗 ...