【MySQL】基础篇

1. MySQL中的NULL值是怎么存放的?

MySQL的compact行格式中会用【NULL值列表】来标记值为NULL的列,NULL值不会存储在行格式中的真实数据部分。

NULL值列表会占用1字节空间,当表中所有字段都被定义成NOT NULL,行格式中就不会有NULL值列表,可节省1字节空间

【1字节8位,每位用0或1填充,0代表不是NULL,1代表为NULL,用0补齐成8位,当列较多时,NULL值列表占用的字节空间可变。】

2.MySQL怎么知道varchar(n)实际占用数据的大小?

MySQL的Compact行格式中会用【变长字段长度列表】存储变长字段实际占用的数据大小。

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

一行记录最大能存储65535字节的数据,但这个是包含【变长字段字节数列表所占用的字节数】和【NULL值列表所占用的字节数】。所以,在算varchar(n)中最大值时,需要减去这两个列表所占用的字节数。

如果一张表只有一个varchar(n)字段,且允许为NULL,字符集为ascii。varchar(n)中n最大取值为65536-变长字段字节数列表所占用的字节数-null值列表所占用的字节数=65535-2-1=【65532】。

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

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

如果一个数据页存不了一条记录,InnoDB存储引擎会自动将溢出的数据存放在【溢出页】中。

Compact行格式:当发生行溢出时,在记录的真实数据处只会保存该的一部分数据,剩余数据放在【溢出页】中,然后真实数据处用【20字节】存储指向溢出页的地址,从而找到剩余数据所在的页。

Compressed和Dynamic两种格式采用【完全的行溢出】方式,记录的真实数据处不会存储该列的一部分数据,只存储20个字节的指针来指向溢出页。实际的数据全部存储在溢出页中。

相关推荐
蓝染yy9 分钟前
Spring Boot
java·spring boot
DemonAvenger15 分钟前
SQL语句详解:SELECT查询的艺术 —— 从基础到实战的进阶指南
数据库·mysql·性能优化
程序猿小D15 分钟前
基于SpringBoot+MyBatis+MySQL+VUE实现的便利店信息管理系统(附源码+数据库+毕业论文+远程部署)
数据库·spring boot·mysql·vue·mybatis·毕业论文·便利店信息管理系统
天天摸鱼的java工程师22 分钟前
如何设计一个高可用的微服务网关?你会如何考虑这道面试题?
java·后端·面试
双力臂40427 分钟前
Java注解与反射:从自定义注解到框架设计原理
java·开发语言
柊二三34 分钟前
关于项目的一些完善功能
java·数据库·后端·spring
潇凝子潇40 分钟前
面条式代码(Spaghetti Code)
java·开发语言·log4j
Java技术小馆1 小时前
MCP AI应用通信的底层机制
java·后端·面试
飞翔的佩奇2 小时前
Java项目:基于SSM框架实现的济南旅游网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+远程部署】
java·数据库·mysql·毕业设计·ssm·旅游·毕业论文
rannn_1112 小时前
【MySQL学习|黑马笔记|Day3】多表查询(多表关系、内连接、外连接、自连接、联合查询、子查询),事务(简介、操作、四大体系、并发事务问题、事务隔离级别)
数据库·笔记·后端·学习·mysql