深入理解InnoDB(1)—行的存储结构

1.InnoDB页的简介

页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位。常见的页类型有数据页、Undo 页、系统页、事务数据页等

2.InnoDB行的存储格式

我们插入MySQL的记录在InnoDB中可能以4中行格式存储,分别是Compact、Redundant、Dynamic和Compressed行格式,我们可以在创建或修改表的语句中指定我们想要的行格式

CREATE TABLE 表名 (列的信息) ROW_FORMAT=行格式名称ALTER TABLE 表名 ROW_FORMAT=行格式名称

2.1 COMPACT行格式

Compact行记录是在MySQL5.0中引入的,为了高效的存储数据,简单的说,就是为了让一个页(Page)存放的行数据越多,这样性能就越高

一条完整的记录被分为记录的额外信息记录的真实数据两大部分

2.1.1 记录的额外信息

这些额外信息分为3类,分别是变长字段长度列表、NULL值列表和记录头信息。

image.png

2.1.1.1 变长字段长度列表

逆序记录每一个列的长度,如果列的长度小于 255 字节,则使用一个字节,否则使用 2 个字节。该字段的实际长度取决于列数和每一列的长度,因此是变长的

2.1.1.2 NULL值列表

一个字节,表示该行是否有 NULL 值。注意:此处需要注意固定长度 CHAR 数据类型和变长 VCHAR 数据类型在 Compact 记录下为 NULL 时不占用任何存储空间。

2.1.1.3 记录头信息

用于描述记录的记录头信息,它是由固定的5个字节组成。5个字节也就是40个二进制位,不同的位代表不同的意思,其中 next_record 记录了下一条记录的相对位置,一个页中的所有记录使用这个字段形成了一条单链表。

2.1.2 记录的真实数据

MySQL会为每个记录默认的添加一些列,除了记录每一列对应的数据外,还有隐藏列,它们分别是 Transaction ID、Roll Pointer 以及 row_id(当没有指定主键)

2.1.2.1 row_id

当用户没有设置主键,并且没有unique属性时,innoDB会隐式的生成一个row_id,作为主键

2.1.2.2 transaction_id 和 roll_pointer

用来记录当前记录的事务号,用于可重复读隔离级别的乐观锁实现

2.2 Redundant行格式

MySQL5.0之前的行记录格式:
image.png

2.2.1 字段长度偏移列表

与 Compact 中的变长字段长度列表相同的是它们都是按照列的逆序顺序设置值的,不同的是字段长度偏移列表记录的是偏移量,每一次都需要加上上一次的偏移,同时对于 CHAR 的 NULL 值,会直接按照最大空间记录,而对于 VCHAR 的 NULL 值不占用任何存储空间。

与compact行格式的不同在于:

  • 存储的是所有属性的长度
  • 长度是通过两个相邻偏移量的差计算得出的
  • 使用了每个列对应偏移量的第一位作为NULL比特位来标记空值,并且对于真实记录为NULL的定长字段也要使用0比特填充,变长则不用
  • 对于char(M)来说,即使使用变长字符集,通通按照字符集的最大字符长度来分配空间

2.2.2 记录头信息

和compact的大致相同

行溢出数据

我们知道数据页的大小是 16KB,Innodb 存储引擎保证了每一页至少有两条记录,当行记录的长度没有超过行记录最大长度时,所有数据都会存储在当前页。如果一页当中的记录过大,会截取前 768 个字节存入页中,其余的放入 BLOB Page。
然后记录的真实数据处用20个字节存储指向这些页的地址(当然这20个字节中还包括这些分散在其他页面中的数据的占用的字节数),从而可以找到剩余数据所在的页

image.png

2.3 Dynamic和Compressed行格式

InnoDB1.0x开始引入心的文件格式(file format,用户可以理解位新的页格式)——Barracuda,这个新的格式拥有两种新的行记录格式:Compressed和Dynamic。
新的两种记录格式对于存放BLOB中的数据采用了完全的行溢出的方式

image.png

  • Dynamic行格式,列存储是否放到off-page页,主要取决于行大小,他会把行中最长的一列放到off-page,直到数据页能存放下两行。TEXT或BLOB列<=40bytes时总是存在于数据页。这种方式可以避免compact那样把太多的大列值放到B-tree Node(数据页中只存放20个字节的指针,实际的数据存放在Off Page中,之前的Compact 和 Redundant 两种格式会存放768个字前缀字节)。

  • Compressed物理结构上与Dynamic类似,Compressed行记录格式的另一个功能就是存储在其中的行数据会以zlib的算法进行压缩,因此对于BLOB、TEXT、VARCHAR这类大长度数据能够进行有效的存储(减少40%,但对CPU要求更高)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做嵌入式的必须学Android吗

做嵌入式的必须学Android吗Android方向适合哪些人呢&#xff1f;适合那些已经在自己领域有了一定的工作经验的人&#xff0c;适合作为自己的拓展&#xff0c;适合提升自己的能力&#xff0c;譬如说已经做三年Linux驱动&#xff0c;就可以尝试拓展去做Android驱动首先从技术角度…

test4

test4 转载于:https://www.cnblogs.com/Forever77/p/11441980.html

boltzmann_推荐系统系列第7部分:用于协同过滤的Boltzmann机器的3个变体

boltzmannRecSys系列 (RecSys Series) Update: This article is part of a series where I explore recommendation systems in academia and industry. Check out the full series: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, and Part 7.更新&#xff1a; 本文是我探索…

.net 初学者_在此初学者课程中学习使用TensorFlow 2.0开发神经网络

.net 初学者Learn how to use TensorFlow 2.0 in this full video course from Tech with Tim. This course will show you how to create neural networks with Python and TensorFlow 2.0.在Tech与Tim的完整视频课程中&#xff0c;学习如何使用TensorFlow 2.0。 本课程将向您…

AndroidStudio怎样导入library项目开源库 - 转

https://jingyan.baidu.com/article/1974b2898917aff4b1f77415.html转载于:https://www.cnblogs.com/EasyLive2006/p/7477719.html

深入理解InnoDB(2)—页的存储结构

1. 记录头信息 上一篇博客说到每行记录都会有记录头信息&#xff0c;用来记录每一行的一些属性 Compact行记录的记录头信息为例 1.1 delete_mask 这个属性标记着当前记录是否被删除&#xff0c;占用1个二进制位&#xff0c;值为0的时候代表记录并没有被删除&#xff0c;为1的…

PHP中的命名空间

1. PHP中的命名空间是什么&#xff1f; 官方解释在此&#xff1a; 命名空间概述 命名空间用一句话说&#xff0c;就是&#xff1a;把 类、函数、变量 等放到逻辑子文件夹中去&#xff0c;以避免命名冲突。 注&#xff1a;命名空间跟实际代码文件在文件系统中的路径没有任何关系…

pandas 入门

pandas简介&#xff1a;pandas包含的数据结构和数据处理工具的设计使得利用进行数据清洗和数据分析非常快捷&#xff1b;与numpy的区别&#xff0c;pandas用来处理表格型或异质型数据的&#xff0c;而numpy更适合处理同质型的数值类数据。 1、Series简介 1、Series是一种一维的…

传智播客软件测试第一期_播客:冒险如何推动一位软件工程师的职业发展

传智播客软件测试第一期On this weeks episode of the freeCodeCamp podcast, Abbey chats with developer and wearer of many hats Princiya about how she changed careers, moved to Berlin, and worked her way up to a lead role.在本周的freeCodeCamp播客节目中&#xf…

爬虫神经网络_股市筛选和分析:在投资中使用网络爬虫,神经网络和回归分析...

爬虫神经网络与AI交易 (Trading with AI) Stock markets tend to react very quickly to a variety of factors such as news, earnings reports, etc. While it may be prudent to develop trading strategies based on fundamental data, the rapid changes in the stock mar…

Promise 原理解析与实现(遵循Promise/A+规范)

1.什么是Promise? Promise是JS异步编程中的重要概念&#xff0c;异步抽象处理对象&#xff0c;是目前比较流行Javascript异步编程解决方案之一 2.对于几种常见异步编程方案 回调函数事件监听发布/订阅Promise对象这里就拿回调函数说说 1.对于回调函数 我们用Jquery的ajax获取数…

php 数据访问练习:投票页面

<!--投票界面--> <html> <head> <title></title> <meta charset"UTF-8"/> <link rel"stylesheet" type"text/css" href"bootstrap.min.css"/> <script src"bootstrap.min.js"…

深入理解InnoDB(3)—索引的存储结构

1. 索引的各种存储结构及其优缺点 1.1 二叉树 优点&#xff1a; 二叉树是一种比顺序结构更加高效地查找目标元素的结构&#xff0c;它可以从第一个父节点开始跟目标元素值比较&#xff0c;如果相等则返回当前节点&#xff0c;如果目标元素值小于当前节点&#xff0c;则移动到左…

有抱负/初级开发人员的良好习惯-避免使用的习惯

When youre learning to code, it can be easy to pick up some nasty habits along the way. Here are some tips to avoid common bad habits, and the good habits to keep in mind.当您学习编码时&#xff0c;很容易在此过程中养成一些讨厌的习惯。 这里有一些技巧&#xf…

业精于勤荒于嬉---Go的GORM查询

查询 //通过主键查询第一条记录 db.First(&user)SELECT * FROM users ORDER BY id LIMIT 1;// 随机取一条记录 db.Take(&user)SELECT * FROM users LIMIT 1;// 通过主键查询最后一条记录 db.Last(&user)SELECT * FROM users ORDER BY id DESC LIMIT 1;// 拿到所有的…

apache 虚拟主机详细配置:http.conf配置详解

Apache的配置文件http.conf参数含义详解 Apache的配置由httpd.conf文件配置&#xff0c;因此下面的配置指令都是在httpd.conf文件中修改。主站点的配置(基本配置) (1) 基本配置:ServerRoot "/mnt/software/apache2" #你的apache软件安装的位置。其它指定的目录如果没…

深入理解InnoDB(4)—索引使用

1. 索引的代价 在了解索引的代价之前&#xff0c;需要再次回顾一下索引的数据结构B树 如上图&#xff0c;是一颗b树&#xff0c;关于b树的定义可以参见B树&#xff0c;这里只说一些重点&#xff0c;浅蓝色的块我们称之为一个磁盘块&#xff0c;可以看到每个磁盘块包含几个数据…

[BZOJ1626][Usaco2007 Dec]Building Roads 修建道路

1626: [Usaco2007 Dec]Building Roads 修建道路 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1730 Solved: 727 [Submit][Status][Discuss]Description Farmer John最近得到了一些新的农场&#xff0c;他想新修一些道路使得他的所有农场可以经过原有的或是新修的道路互达…

双城记s001_双城记! (使用数据讲故事)

双城记s001Keywords: Data science, Machine learning, Python, Web scraping, Foursquare关键字&#xff1a;数据科学&#xff0c;机器学习&#xff0c;Python&#xff0c;Web抓取&#xff0c;Foursquare https://br.pinterest.com/pin/92816442292506979/https://br.pintere…

python:linux中升级python版本

https://www.cnblogs.com/gne-hwz/p/8586430.html 转载于:https://www.cnblogs.com/gcgc/p/11446403.html