ITPub博客

首页 > 数据库 > 数据库开发技术 > 字节一面:MySQL 是怎么存储 NULL 的?

字节一面:MySQL 是怎么存储 NULL 的?

原创 数据库开发技术 作者:飞天小牛肉 时间:2023-05-17 08:38:00 0 删除 编辑

分享大厂面试真题原创题解 & 成长经验

推荐订阅 #大厂面试 #校招扫盲

刷题网站: itmtx.cn

MySQL 怎么存储,其实问的是 InnoDB 怎么存储,如果你清楚 InnoDB 存储引擎一行记录的格式,那么关于 NULL 值怎么存放这个问题,其实还是很简单的。本题已收录至 itmtx.cn,点击文末 阅读全文 可直达刷题网站:

InnoDB 逻辑存储结构

InnoDB 中的所有数据都被逻辑地存放在一个空间中,这个空间被称之为 “表空间”(tablespace),表空间可以看作 InnoDB 存储引擎逻辑结构的最顶层,其中包含以下几个部分:

  • 段(segment):表空间是由各个段组成的,常见的段有:
    • 数据段(leaf node segment):InnoDB 是索引组织表(index organized)的,数据即索引,索引即数据,因此数据段其实就是索引(B+ 数的叶子结点)
    • 索引段(non-leaf node segment):B+ 树的非叶子节点
    • 回滚段(rollback segment):也就是 undo log 中的数据
  • 区(extent):一个段最多可以申请 4 个区,区由 64 个连续的页组成,每个页大小为 16KB,即每个区的大小为 64 * 16 = 1M
  • 页(page),也称为 “块”(block):页是 InnoDB 磁盘管理的最小单位。每个页中的数据组织形式是 “行(row)”,也就是说数据是按行进行存放的,每个页最多存放 16KB / 2 ~ 200  = 7992 行的记录

InnoDB 行记录格式

InnoDB 存储引擎提供了 Compact 和 Redundant 两种格式来存放行记录格式,MySQL 5.1 默认保存为 Compact 格式。

可以通过 show table status like 'table_name' 来查看当前表使用的行记录格式。

Redundant 是为了兼容 MySQL 5.0 之前的版本来存在的,这里就不详细说了,主要看 Compact 格式,如下所示:

首先,Compact 行格式的首部是一个非 NULL 变长字段(varchar)的长度列表,并且这个长度列表是按照列的顺序逆序放置的:

  • 当列的长度 < 255 字节,用 1 个字节标识
  • 当列的长度 > 255 字节,用 2 个字节标识

举个例子,比如有四个字段 (id, name, age, address),name 和 address 都是变长类型,有两行记录:

id name age address
1 Job 20 Los Angeles
2 Julia 21 Panama
  • name 列的长度分别是 3 和 5,十六进制表示 0x03 和 0x05
  • address 列的长度分别是 11 和 6,十六进制表示 0xB 和 0x06

这两行记录对应的 Compact 格式如下图所示:

第二个部分就是 NULL 标识位,用于指示这行数据中是否有 NULL 值,若有的话,则将对应的比特位置为 1。具体来说,每个列对应一个二进制位(bit),二进制位同样按照列的顺序逆序排列。

比如有一行记录 id = 1, name = "admin", age = NULL,那么这行记录对应的 NULL 标位就是 100(逆序排放,[age, name, id]),然后在高位补 0,最终就是 0000 0100

第三部分是记录头信息(record header),固定占用 5 个字节(40 位),主要就是包含比如该行是否已被删除、页中下一条记录的相对位置等等之类的

往期推荐

关注我们

我的刷题网站上线啦!整理了上百篇真实面经,从今天开始摆脱八股文困扰!

2023-05-06

「ZEKU」眼见他起朱楼,眼见他宴宾客,眼见他楼塌了

2023-05-13

为啥GPT一出,国内各大厂商的大模型就跟雨后春笋一样冒出来了?个个都还宣称渊源已久。。。

2023-05-10

现在面试都不满足于问进程线程,开始问起协程了?

2023-04-25

面试被问到不懂的东西,是直接说不懂还是坚持硬撑一下?

2023-05-03



分享大厂面试真题原创题解 & 成长经验.

刷题网站: itmtx.cn

回复『校招』获取招聘信息和交流群
回复『Echo』获取社区项目手把手教程

原文作者:飞天小牛肉;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2020-12-31

  • 博文量
    205
  • 访问量
    89251