mysqlMySQL学习记录

MySQL -- 行格式

2019-07-06  本文已影响0人  sunyelw

前言

最近在学MySQL,决定记录一下,能写多少写多少,不定时更新,加油。

正文

分几个部分来吧,大致如下:

本文为第二部分 第一节 行格式


概述

一拍键盘,上回说到:

上回说没说到不重要, 重要的是


先对InnoDB有个大致的了解,

下面基于InnoDB看看MySQL中数据是如何存储的.


行格式

定义

分类

下面通过Compact行格式的实现来初步看看MySQL的记录存储智慧。

正文

本节内容均是单条记录范围内, 不要绕晕, 下一章讲页就是页范围

Compact行格式各部分组成(来源网络)

一、变长字段长度列表

几个点了解一下:

  1. 何谓变长?就是不定长。不定长从两个点理解: 字符集与属性类型
  2. 变长类型示例:varcharvarbinarytextblob
  3. 这些变长列的实际占用字节数以逆序方式存储在变长字段长度列表
  4. 允许的最大字节超过255且实际存储超过127字节, 使用两个字节存储其长度, 否则使用一个字节.(看到有多节省了吗...)
  5. 变长列不为null时, InnoDB才会存储其字节长度
  6. 如果没有变长列或变长列都为null,则当前记录没有此部分
  7. 第一个字节的第一位是标志位,表示是否双字节表示.(有点像gbk哈)

这里注意最后一点, InnoDB在读字段变长列表时会先查表结构, 允许的最大字节数超过255时才会使用这个二进制位作为标识位来判断是读一个字节还是两个字节,没有超过就直接读一个字节也就不存在标识位了

举个栗子
col 类型为varchar(255)

  1. 如果字符集为ascii, col列允许的最大字节为 255 * 1 = 255个字节,说明撑死了2^8 - 1个字节,一个字节存其长度就够了;
  2. 如果字符集为utf8, col 允许的最大字节为 255 * 3 = 765个字节,大于255,那就要看实际占用字节数了, 一个不够就两个

问题:Compact行格式下,页中某列最大字节长度是多少?(可以先想想)

答案:不要忘了记录是存在页里面的,每页一般16KB,也就是65536个字节,16次方不就占两个字节吗~
当然有可能一列超过16KB,那就会溢出了(溢出页),这里只记录当前页的占用字节数。

二、NULL值列表

同样几个点了解一下:

这就不举栗子了,被我吃完了。

三、记录头信息

记录头:"上面的两位都是弟弟。"

Compact行格式下记录头各部分示意图(来源网络)
名称 大小(单位:bit) 描述
预留位1 1 没有使用
预留位2 1 没有使用
delete_mask 1 标记该记录是否被删除
min_rec_mask 1 B+树的每层非叶子节点中的最小记录都会添加该标记
n_owned 4 表示当前记录拥有的记录数
heap_no 13 表示当前记录在记录堆的位置信息
record_type 3 表示当前记录的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录
next_record 16 表示下一条记录的相对位置

这里一堆属性,我们挑几个看看

delete_mask
min_rec_mask
n_owned
heap_no
record_type
next_record

四、正式数据部分

额外信息部分说差不多了,到真正存储数据的地方了,喝口水再继续吧。


朋友之上恋人未满的三个特殊列:

列名 是否必须 占用空间 描述
row_id 6字节 行ID,唯一标识一条记录
transaction_id 6字节 事务ID
roll_pointer 7字节 回滚指针
这三个的位置在真正数据的最开始位置, 属于MySQL为我们添加的隐藏列,不过也不是所有的情况都添加:
  • MySQL有个自增的功能,其实是维护了一个全局变量
  • 这个变量存储在系统表空间的7号表(7号表空间)中,随着记录的插入而自增, 每逢256的倍数就刷到磁盘中
  • 重启系统取出后加上256再赋予给自增列, 因为库中可能已经超过了刷到磁盘中的这个值
  • 最后一点, 强扭的瓜不仅不甜也不解渴, 所以没看懂就不要勉强......

到此, 每条记录的Compact格式说完了,其他行格式大家有兴趣就自己找找资料看看吧,这里不展开了。


数据页放下一章,太长了也不好,我说的对吧

回见~

上一篇 下一篇

猜你喜欢

热点阅读