【MYSQL】InnoDB行溢出数据说明
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,首先说下MySQL数据库的varchar字段,真的很实用,它可以存放65536字节的数据,比oracle和sqlserver大多了,但是在使用varchar时也有几点要注意;1、65536只是这么说,
千家信息网最后更新 2025年02月01日【MYSQL】InnoDB行溢出数据说明首先说下MySQL数据库的varchar字段,真的很实用,它可以存放65536字节的数据,比oracle和sqlserver大多了,但是在使用varchar时也有几点要注意;
1、65536只是这么说,要建表的时候指定一个字段65536仍然会报错,因为字段本身还有其他开销,实际只能存放65532字节。
2、65532字节并不是每个varchar字段都可以设置的,他是一个总和,也就是说如果有2个varchar字段的表,那么每个varchar字段只能设置65532/2的值。
3、建表时要注意编码格式哦,varchar(65532)代表的是字节数,如果使用GBK或者UTF-8那就无法建立成功了,因为GBK一个字符占用2字节,UTF-8一个字符占用3字节
以上概念比较简单,大家建个表试验一下就好,这里不再做实验;大家知道,页(PAGE)是innoDB存储引擎的最小存储单位,默认大小为16KB,及16384字节,行数据存储在页中;那么一行数据如果超过了一个页能够存储的大小怎么办?比如上面说的varchar(65532),65532字节该如何存储?这个时候就会发生行溢出。
行溢出:
InnoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,一般为BLOB\LOB这类的大对象列类型。但是也不是绝对,BLOB可以不将数据放在溢出页面,而且即便是VARCHAR列数据类型,依然有可能被存放为行溢出数据,比如上例
我们执行:insert into 表名 select repeat('a',65532),就将一行65532字节的数据插入到表中了,实际上在底层,真正的数据页只存储了一小部分数据,之后是偏移量,指向行溢出数据,这时会产生N个未压缩的二进制大对象页 Uncompressed BLOB Page,这些大对象页中才是完整存放了65532字节的数据。
那么,一行数据为多大时,会发生行溢出呢?我们知道InnoDB存储引擎表是索引组织的,即B+树结构,这样一个页中至少要保证有2条数据,否则就变成链表了,如果只能存放一条数据,那么InnoDB存储引擎会自动将它存放在溢出页中。如果可以在一个页中至少放入两行数据,那么就不会发生行溢出
其实对于BLOB类型的数据,跟varchar也是一个道理,要看实际的大小,当然,用户既然使用了blob列类型,一般不可能存放长度过小的数据,因此在大多数情况下BLOB的行数据还是会发生行溢出,实际数据保存在BLOB页中,数据页只保存数据的前768字节。
1、65536只是这么说,要建表的时候指定一个字段65536仍然会报错,因为字段本身还有其他开销,实际只能存放65532字节。
2、65532字节并不是每个varchar字段都可以设置的,他是一个总和,也就是说如果有2个varchar字段的表,那么每个varchar字段只能设置65532/2的值。
3、建表时要注意编码格式哦,varchar(65532)代表的是字节数,如果使用GBK或者UTF-8那就无法建立成功了,因为GBK一个字符占用2字节,UTF-8一个字符占用3字节
以上概念比较简单,大家建个表试验一下就好,这里不再做实验;大家知道,页(PAGE)是innoDB存储引擎的最小存储单位,默认大小为16KB,及16384字节,行数据存储在页中;那么一行数据如果超过了一个页能够存储的大小怎么办?比如上面说的varchar(65532),65532字节该如何存储?这个时候就会发生行溢出。
行溢出:
InnoDB存储引擎可以将一条记录中的某些数据存储在真正的数据页面之外,一般为BLOB\LOB这类的大对象列类型。但是也不是绝对,BLOB可以不将数据放在溢出页面,而且即便是VARCHAR列数据类型,依然有可能被存放为行溢出数据,比如上例
我们执行:insert into 表名 select repeat('a',65532),就将一行65532字节的数据插入到表中了,实际上在底层,真正的数据页只存储了一小部分数据,之后是偏移量,指向行溢出数据,这时会产生N个未压缩的二进制大对象页 Uncompressed BLOB Page,这些大对象页中才是完整存放了65532字节的数据。
那么,一行数据为多大时,会发生行溢出呢?我们知道InnoDB存储引擎表是索引组织的,即B+树结构,这样一个页中至少要保证有2条数据,否则就变成链表了,如果只能存放一条数据,那么InnoDB存储引擎会自动将它存放在溢出页中。如果可以在一个页中至少放入两行数据,那么就不会发生行溢出
其实对于BLOB类型的数据,跟varchar也是一个道理,要看实际的大小,当然,用户既然使用了blob列类型,一般不可能存放长度过小的数据,因此在大多数情况下BLOB的行数据还是会发生行溢出,实际数据保存在BLOB页中,数据页只保存数据的前768字节。
数据
字节
存储
字段
实际
引擎
类型
一行
大小
对象
字符
时候
页面
UTF-8
实用
最小
成功
也就是
也就是说
二进制
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全社保防火墙挂什么科目
网络安全南美停电
网络安全市场增长空间
数据库字符型单引号
上海网络技术咨询案例
aix删除db2数据库
陕西十四五规划网络安全
禅道数据库默认密码
韩服传奇db数据库
厦门勇士网络技术股份
全球权威引文数据库
web服务器配置中默认端口号是
防护1000的服务器
关系数据库的术语是
圣境传说2服务器
计算机网络技术必修课程
编写一个小说数据库的字段
网络安全工作启示
sql用什么语句切换数据库
网络安全诚信为人民倡议书
数据库设计实例两根线
国家网络安全法 百度
大学网络技术基础
网络技术应用心理
第一财经商业数据库
数据库提示无法创建约束索引
连无线网络安全密钥是什么
网络安全行动的目的
丹江口软件开发
政府网站网络安全工作责任制