MYSQL原理学习篇简记(三)

 

👏作者简介:大家好,我是小周同志,25届双非校招生Java选手,很高兴认识大家

📕学习出处:本文是学自小林coding (xiaolincoding.com) 网站的MYSQL图解篇

🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦

varchar(n) 中 n 最大取值为多少?  

单字段的情况

一行数据的最大字节数是 65535(不包含 TEXT、BLOBs 这种大对象类型),其中包含了 storage overhead

storage overhead 是什么?其实就是「变长字段长度列表」「NULL 值列表」,也就是说一行数据的最大字节数 65535,其实是包含「变长字段长度列表」和 「NULL 值列表」所占用的字节数的。所以, 我们在算 varchar(n) 中 n 最大值时,需要减去 storage overhead 占用的字节数。

因为我们存储字段类型为 varchar(n) 的数据时,其实分成了三个部分来存储:

  • 真实数据

  • 真实数据占用的字节数

  • NULL 标识,如果不允许为NULL,这部分不需要

NULL 值列表 所占用的字节数是多少?

  • 前面我创建表的时候,字段是允许为 NULL 的,所以会用 1 字节来表示「NULL 值列表」

变长字段长度列表 所占用的字节数是多少?

「变长字段长度列表」所占用的字节数 = 所有「变长字段长度」占用的字节数之和。

所以,我们要先知道每个变长字段的「变长字段长度」需要用多少字节表示?具体情况分为:

  • 条件一:如果变长字段允许存储的最大字节数小于等于 255 字节,就会用 1 字节表示「变长字段长度」;

  • 条件二:如果变长字段允许存储的最大字节数大于 255 字节,就会用 2 字节表示「变长字段长度」

  • 在 UTF-8 字符集下,一个字符最多需要三个字节,varchar(n) 的 n 最大取值就是 65532/3 = 21844。

多字段的情况

如果有多个字段的话,要保证所有字段的长度 + 变长字段字节数列表所占用的字节数 + NULL值列表所占用的字节数 <= 65535

行溢出后,MySQL 是怎么处理的?

MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,而一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。这个时候就会发生行溢出,多的数据就会存到另外的「溢出页」中

相关推荐

  1. MYSQL原理学习简记()

    2024-04-14 12:44:02       40 阅读
  2. MYSQL原理学习简记(五)

    2024-04-14 12:44:02       39 阅读
  3. 【面试题】MySQL(第

    2024-04-14 12:44:02       20 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 12:44:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 12:44:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 12:44:02       82 阅读
  4. Python语言-面向对象

    2024-04-14 12:44:02       91 阅读

热门阅读

  1. 爬虫开发教程

    2024-04-14 12:44:02       39 阅读
  2. 蓝桥杯算法题:小数第n位

    2024-04-14 12:44:02       40 阅读
  3. Qt第六章对话框

    2024-04-14 12:44:02       38 阅读
  4. SpringBoot 异步延时任务

    2024-04-14 12:44:02       135 阅读
  5. Asp.net 使用了 bootstrap,发布时样式丢失了

    2024-04-14 12:44:02       43 阅读
  6. Hadoop MapReduce解析

    2024-04-14 12:44:02       39 阅读