文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

【MYSQL】InnoDB行溢出数据说明

2024-04-02 19:55

关注
    首先说下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字节。


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯