InnoDB(4)行溢出--mysql从入门到精通(九)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: InnoDB(4)行溢出--mysql从入门到精通(九)

上篇文章说了compact行格式中真实数据存储,真实数据innoDB会默认添加transaction_id事务id,roll_pointer回滚指针,其中row_id不是必须的,当用户设置了primery key主键默认用用户设置的,没设置,找一个unique列,若都没有,则会用row_id。

还说了char(M)类型存储,若是变长字符集,比如gbk,utf8,则会存储在变长字段长度列表,固定字符集则不会,而且需要注意的是,默认会在内存中占据M的字节。


InnoDB(3)记录真实数据--mysql从入门到精通(八)


行溢出数据


Varchar(M)类型最多存储多大?65535个字节,如果使用ascii字符集,一个字符代表一个字节,如果创建的话则会如下:


mysql> create table max_size(
   ->   c varchar(65535)
   -> ) charset=ascii row_format=compact;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs


很明显报错了,从错误可以看到,我们创建的字段过长,系统让我们改成text或者blob类型,因为这个65535个字节,除了我们需要存储的真是数据外,还有额外数据:变长字段长度列表,null值列表(若有not null)则可以省略。


因为我们没有设置not null,所以变长字段长度可能占两个字节,null占一个字节,所以65532个字节。


create table max_size_ascii(   c varchar(65532) ) charset=ascii row_format=compact;
Query OK, 0 rows affected (0.06 sec)


如果设置not null,则就可以存储65533个字节,这里就不写sql了。


如果不是使用ascii字符集呢,用gbk和utf8?


mysql> create table max_size_gbk(
   ->   c varchar(65535)
   -> ) charset=gbk row_format=compact;
ERROR 1074 (42000): Column length too big for column 'c' (max = 32767); use BLOB or TEXT instead
mysql> create table max_size_utf(
   ->   c varchar(65535)
   -> ) charset=utf8 row_format=compact;
ERROR 1074 (42000): Column length too big for column 'c' (max = 21845); use BLOB or TEXT instead

根据sql提示可以看到,创建gbk字符集的表,则最大可以用32767个字节(65532/2),因为gbk一个字符占用的最大字节是2,而utf8一个字符占用的最大字节是3,所以报错21845(65532/3)。


一个表中所有列(不包括隐藏列和记录头信息),占用的最大字节长度为65535个字节。


数据太多产生溢出怎么办


我们知道mysql处理数据是分成若干页,一个页大小约16kb,也就是16384字节,而varchar(M)中的m最大可存储65532字节,那溢出的就会放在其他页码中。repeat('a',65532)代表重复insert数据65532次,吧数据填满


mysql> insert into max_size_ascii1 (c1) values (repeat('a',65532));
Query OK, 1 row affected (0.01 sec)


在compact和redundant行格式中,真实数据存放处就会放指向后面页数据的内存地址,前面一部分存放780字节的真实数据,从而根据页码地址找到剩余的数据。


Dynamic和Compressed行格式


Mysql版本5.7后默认用的是dynamic行格式,他们和compact行格式基本一致,唯一有点不同的就是行数据溢出的存储方式,他们在真实数据列表不会存储真实数据,只存储页码的地址值,从而查询数据的页码。而compact行数据溢出是在前780左右字节存一部分真实数据。


而compressed和dynamic不同处:compressed会采用压缩算法来对页面进行压缩,节省空间。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
2月前
|
存储 关系型数据库 MySQL
介绍MySQL的InnoDB引擎特性
总结而言 , Inno DB 引搞 是 MySQL 中 高 性 能 , 高 可靠 的 存 储选项 , 宽泛 应用于要求强 复杂交易处理场景 。
123 15
|
7月前
|
存储 网络协议 关系型数据库
MySQL8.4创建keyring给InnoDB表进行静态数据加密
MySQL8.4创建keyring给InnoDB表进行静态数据加密
243 1
|
10月前
|
SQL 关系型数据库 MySQL
网安入门之MySQL后端基础
《网安入门之MySQL后端基础》简介: 本文介绍了数据库及MySQL的基础知识,涵盖数据库的概念、结构与操作。数据库是组织化存储数据的集合,通过表、列、行等结构实现高效管理。MySQL作为开源的关系型数据库管理系统,广泛应用于Web开发。文中详细讲解了MySQL的基本操作,如增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)等语句的使用方法,并介绍了数据库事务的ACID特性。此外,还探讨了SQL注入攻击的风险及防范措施,强调了预处理语句的重要性。最后,简述了PHP中mysqli扩展的使用方法,包括连接数据库、执行查询和关闭连接等步骤。
|
11月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
1927 57
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
7月前
|
SQL 缓存 关系型数据库
使用温InnoDB缓冲池启动MySQL测试
使用温InnoDB缓冲池启动MySQL测试
142 0
|
11月前
|
存储 关系型数据库 MySQL
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
458 7
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
133 3
|
2月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
2月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。

推荐镜像

更多