mysql - 为什么MySQL不建议使用NULL作为列默认值?

为什么MySQL不建议使用NULL作为列默认值?

InnoDB有4中行格式:

  • Redundant : 非紧凑格式,5.0 版本之前用的行格式,目前很少使用,
  • Compact : 紧凑格式,5.1 版本之后默认行格式,可以存储更多的数据
  • Dynamic , Compressed : 和Compact类似,5.7 版本之后默认使用 Dynamic 行格式,在Compact基础上做了改进,基础设计原理没变

由于Redundant较少使用, 且Dynamic和Compressed是基于Compact的, 故这里以Compact为例。

Compact行格式如下:

存储的额外数据 存储的真实数据
变长数据列的长度 NULL值的列表 记录头信息 row_id (隐藏字段) trx_id (隐藏字段) roll_ptr (隐藏字段) 列1 列2 ... 列n

由于:

  1. NULL值列表的数量, 与允许为null的字段数量一致 如, 有7个字段允许为null, 则有7个NULL值列表
  2. NULL值列表至少占用1字节空间, 故当数据量越大或null列越多时, 占用的存储空间越多

综上所述, 不建议允许列为null, 可使用其他默认值(如空字符串, 0等)

相关推荐
九皇叔叔39 分钟前
MySQL 8.x 隔离级别调整
数据库·mysql·事务·隔离级别
许愿OvO2 小时前
MySQL 8.3.0 运维与集群架构实战
运维·mysql·架构
程序员张32 小时前
MySQL创建用户且只能访问指定数据库表
mysql
阿维的博客日记4 小时前
我现在能理解mvcc让读不阻塞,但是无法理解mvcc让写不阻塞??
mysql·事务·mvcc
禹凕4 小时前
MYSQL——基础知识(SQL的临时表和克隆表)
sql·mysql
jvvz afqh4 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
阿维的博客日记4 小时前
隔离性和mvcc有什么关系吗
数据库·mysql·事务·mvcc·隔离性
Vect__5 小时前
初识MySQL,数据库相关概念,库操作,表操作
数据库·mysql
空空潍5 小时前
MySQL索引不生效?一文理解CBO成本模型
数据库·sql·mysql
nLYA SCOL5 小时前
MySQL数据的增删改查(一)
android·javascript·mysql