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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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会采用压缩算法来对页面进行压缩,节省空间。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
2月前
|
关系型数据库 MySQL 数据库
MySQL基本操作入门指南
MySQL基本操作入门指南
79 0
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
107 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
5天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的段、区和页
MySQL的InnoDB存储引擎逻辑存储结构与Oracle相似,包括表空间、段、区和页。表空间由段和页组成,段包括数据段、索引段等。区是1MB的连续空间,页是16KB的最小物理存储单位。InnoDB是面向行的存储引擎,每个页最多可存放7992行记录。
|
6天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,广泛应用于互联网公司。它支持事务、行级锁、外键和高效处理大量数据。InnoDB的主要特性包括解决不可重复读和幻读问题、高并发度、B+树索引等。其存储结构分为逻辑和物理两部分,内存结构类似Oracle的SGA和PGA,线程结构包括主线程、I/O线程和其他辅助线程。
【赵渝强老师】MySQL的InnoDB存储引擎
|
1月前
|
存储 缓存 关系型数据库
详细解析MySQL中的innodb和myisam
总之,InnoDB和MyISAM各有千秋,选择合适的存储引擎应基于对应用程序特性的深入理解,以及对性能、数据完整性和可扩展性的综合考量。随着技术发展,InnoDB因其全面的功能和日益优化的性能,逐渐成为更广泛场景下的首选。然而,在特定条件下,MyISAM依然保留其独特的价值。
112 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL入门到精通
MySQL入门到精通
|
3月前
|
监控 关系型数据库 MySQL
在Linux中,mysql的innodb如何定位锁问题?
在Linux中,mysql的innodb如何定位锁问题?
|
7天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
20 4