加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

深入浅出诠释MySQL数据行溢出

发布时间:2022-03-25 08:57:40 所属栏目:编程 来源:互联网
导读:为腾讯云数据库高级产品经理迪B哥开设的面向数据库开发者、数据库运维人员、云端运维人员的系列培训课程,旨在帮助大家从入门到精通学习和使用数据库。 本期为迪B课堂特刊【MySQL经典案例解析系列】第二期。 搜索关注腾讯云数据库官方微信,回复迪B课堂,即
       为腾讯云数据库高级产品经理迪B哥开设的面向数据库开发者、数据库运维人员、云端运维人员的系列培训课程,旨在帮助大家从入门到精通学习和使用数据库。
 
      本期为迪B课堂特刊【MySQL经典案例解析系列】第二期。 搜索关注“腾讯云数据库”官方微信,回复“迪B课堂”,即可查看历史十期迪B课堂教程~
 
一、从常见的报错说起
故事的开头我们先来看一个常见的sql报错信息:
  
      相信对于这类报错大家一定遇到过很多次,“数据大”也是生产过程中绕不开的一个话题。这里的数据“大”,远不止存储空间占用多,其中也包括了单个(表)字段存储多、大,数据留存时间长,数据冗余多,冷热数据不明显导致的体量大,访问峰值随着热点变化明显,逻辑处理复杂导致数据存储压力放大等等。回到这个报错的问题上来,我们先来看一下这个表的结构:
 
二、深入探索
      接着我们再来深入分析下关于限制大小“65535”的一些容易混淆的概念。
 
1. “65535”不是单个varchar(N)中N的最大限制,而是整个表非大字段类型的字段的bytes总合。
  
2. 不同的字符集对字段可存储的max会有影响,例如,UTF8字符需要3个字节存储,对于VARCHAR(255)CHARACTER SET UTF8列,会占用255×3 =765的字节。故该表不能包含超过65,535/765=85这样的列。GBK是双字节的以此类推。
 
3. 可变长度列在评估字段大小时还要考虑存储列实际长度的字节数。例如,VARCHAR(255)CHARACTER SET UTF8列需要额外的两个字节来存储值长度信息,所以该列需要多达767个字节存储,其实最大可以存储65533字节,剩余两个字节存储长度信息。
 
4. BLOB、TEXT、JSON列不同于varchar、char等字段,列长度信息独立于行长存储,可以达到65535字节真实存储。
 
5. 定义NULL列会降低允许的最大列数。
 
InnoDB表,NULL和NOT NULL列存储大小是一样
MyISAM表,NULL列需要额外的空间记录其值是否为NULL。每个NULL需要一个额外的位(四舍五入到最接近的字节)。最大行长度计算如下: row length = 1 + (sum of column lengths) + (number of NULL columns + delete_flag + 7)/8 + (number of variable-length columns)
静态表,delete_flag = 1,静态表通过在该行记录一个位来标识该行是否已被删除。
动态表,delete_flag = 0,该标记存储在动态行首
 
 
6. 对于InnoDB表,NULL和NOT NULL列存储大小是一样
 
7. InnoDB允许单表最多1000个列
 
8. varchar主键只支持不超过767个字节或者768/2=384个双字节 或者767/3=255个三字节的字段 而GBK是双字节的,UTF8是三字节的
 
9. 不用的引擎对索引的限制有区别
 
innodb每个列的长度不能大于767 bytes;所有组成索引列的长度和不能大于3072 bytes
myisam 每个列的长度不能大于1000 bytes,所有组成索引列的长度和不能大于1000 bytes

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读