MySQL行格式(row format)

MySQL行格式(row format)

表的行格式决定了其行的物理存储方式,这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行,查询和索引查找可以更快地工作,缓冲池中需要的高速缓存内存更少,写出更新值所需的 I/O 也更少。

每个表中的数据都分为页。组成每个表的页被排列在称为 B 树索引的树数据结构中。表数据和二级索引都采用这种类型的结构。表示整个表的 B 树索引称为聚集索引,它根据主键列进行组织。聚集索引数据结构的节点包含行中所有列的值。二级索引结构的节点包含索引列和主键列的值。

可变长度列是列值存储在 B 树索引节点中的规则的一个例外。太长而无法放入 B 树页面的可变长度列存储在单独分配的磁盘页面(称为溢出页面)上。此类列称为页外列。页外列的值存储在溢出页的单链接列表中,每个此类列都有其自己的一个或多个溢出页列表。根据列长度,可变长度列值的全部或前缀存储在 B 树中,以避免浪费存储空间和必须读取单独的页面。

存储InnoDB引擎支持四种行格式:REDUNDANT、COMPACT、 DYNAMIC和COMPRESSED。

REDUNDANT 格式

REDUNDANT 是 InnoDB 最早的行格式,主要用于早期版本的 MySQL。这种格式的特点是存储更多的元数据,如额外的系统信息和字段的长度信息,使得每行数据占用更多的空间。虽然 REDUNDANT 行格式提供了良好的向后兼容性,但它的存储效率低下。在这种行格式中,即使字段内容为空,也会为其分配存储空间。尽管现在已经不再推荐使用此格式,但了解其历史意义对理解 MySQL 的发展仍然有一定价值。

COMPACT 格式

COMPACT 行格式是对 REDUNDANT 的改进,它减少了每行的元数据量,并优化了空间使用。在 COMPACT 格式中,NULL值的列不会占用存储空间,且对可变长度字段的处理更加高效。这种行格式通过不保存前缀长度来减少存储需求,并且仅在必要时存储变长字段的实际长度。因此,COMPACT 格式适用于包含许多可变长度列(如 VARCHAR、TEXT 或 BLOB 类型)的表,能显著提高数据的存储效率和访问速度。

DYNAMIC 格式

DYNAMIC 行格式是 InnoDB 的一种更加灵活的行格式,特别适用于包含大量变长字段的表。与 COMPACT 格式相比,DYNAMIC 格式可以更高效地处理长文本和二进制数据,因为它将过长的数据存储到专门的溢出页中。这种设计允许基本记录页面更紧凑,从而减少了因为频繁访问大数据而导致的性能下降。因此,对于那些包含大字段或者需要频繁更新这些字段的应用,DYNAMIC 行格式提供了更高的效率和更好的性能。

COMPRESSED 格式

COMPRESSED 行格式结合了 DYNAMIC 格式的特性,并引入了数据压缩功能,旨在进一步减少磁盘占用和提高IO效率。这种格式特别适合那些磁盘空间较为昂贵或I/O速度较慢的环境。通过压缩数据,可以在磁盘上存储更多的数据,同时由于读取的数据量减少,可以提高数据访问速度。不过,需要注意的是,数据的压缩和解压缩会消耗额外的CPU资源,因此在CPU受限的环境下使用 COMPRESSED 格式可能会对性能产生负面影响。

QA

如何查看表的行格式?

要查看 MySQL 中表的行格式,你可以使用 SQL 查询来获取相关信息。以下是几种常用的方法:

  1. 使用 SHOW TABLE STATUS 命令:
    这个命令可以提供包括行格式在内的表的详细状态信息。例如,要查看名为 mytable 的表的行格式,你可以执行:

    SHOW TABLE STATUS LIKE 'mytable';
    

    在返回的结果中,会有一个 Row_format 的列显示该表的行格式。

  2. 查询 information_schema.tables:
    INFORMATION_SCHEMA 是 MySQL 提供的一个数据库,其中包含了关于其他所有数据库的元数据。你可以从这里查询特定表的行格式:

    SELECT TABLE_NAME, ROW_FORMAT 
    FROM information_schema.tables 
    WHERE table_schema = 'your_database_name' AND table_name = 'your_table_name';
    

    your_database_nameyour_table_name 替换为你的数据库名和表名。

  3. 使用 SHOW CREATE TABLE 命令:
    这个命令会显示用于创建指定表的完整 SQL 语句,其中包括行格式的信息。执行:

    SHOW CREATE TABLE your_table_name;
    

    输出结果中将包括行格式设置,如果在创建表时指定了行格式的话。

如何定义表的行格式?

在 MySQL 中,你可以在创建表时或者修改现有表的定义来指定行格式。这可以通过 ROW_FORMAT 选项实现,这个选项可以在 CREATE TABLEALTER TABLE 语句中使用。

创建表时定义行格式

当你创建一个新表时,可以直接在 CREATE TABLE 语句中指定行格式。以下是一个示例,展示如何在创建表时设置行格式为 DYNAMIC

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    data VARCHAR(255)
) ENGINE=InnoDB ROW_FORMAT=DYNAMIC;

在这个例子中,example 表将使用 InnoDB 存储引擎和 DYNAMIC 行格式。你可以根据需要将 ROW_FORMAT 的值改为 COMPACT, REDUNDANT, COMPRESSED 等。

修改现有表的行格式

如果你想改变一个已经存在的表的行格式,可以使用 ALTER TABLE 语句。以下是如何将一个现有表的行格式改为 COMPRESSED 的示例:

ALTER TABLE example ROW_FORMAT=COMPRESSED;

这条语句会将 example 表的行格式改为 COMPRESSED。修改表的行格式可能会触发表的重建,这可能需要一定的时间完成,特别是对于数据量大的表。

注意事项

  • 在选择行格式时,需要确保你的 MySQL 服务器支持你选择的行格式。某些较旧的 MySQL 版本可能不支持所有现代行格式。
  • 行格式的选择应考虑到数据的特点和访问模式,以最大化查询性能和存储效率。
  • 修改大表的行格式可能会导致较长时间的服务中断,因为修改过程中表可能会不可用。
  • 使用 COMPRESSED 行格式时,还可以结合使用 KEY_BLOCK_SIZE 参数来指定压缩的粒度。

MySQL 默认的行格式是什么?

从 MySQL 5.7 版本开始,InnoDB 的默认行格式是 DYNAMIC。这一变化旨在优化数据存储的灵活性和效率,特别是对于包含大量可变长度字段的表。DYNAMIC 格式能够有效地处理较长的文本和二进制数据,并将过长的字段值存储在外部页中,从而提高页的空间利用率和整体性能。

行格式和存储引擎有关系吗?具体是什么关系?

行格式和存储引擎之间的关系非常紧密,因为行格式是由存储引擎决定并实现的,它影响了数据的物理存储方式、访问速度以及索引的结构和效率。

在 MySQL 中,不同的存储引擎如 InnoDB、MyISAM、MEMORY 等支持不同的行格式,且每种存储引擎的实现和优化目标不同,因此它们提供的行格式也各不相同。例如:

  • InnoDB:这是 MySQL 默认的存储引擎,支持 REDUNDANTCOMPACTDYNAMICCOMPRESSED 等行格式。InnoDB 优化了事务处理、数据完整性和并发控制,其行格式选择能够影响数据的压缩度、存储效率以及事务处理性能。

  • MyISAM:另一种较早的存储引擎,主要支持固定(FIXED)和动态(DYNAMIC)行格式。固定行格式在处理静态数据时非常高效,因为所有记录占用相同的字节数,直接读取特定记录变得非常快速。而动态行格式则允许记录占用变化的字节数,更适合存储有大量可变长度字段的数据。

行格式对性能的影响主要体现在数据的读写效率、存储空间的使用以及维护数据完整性和一致性的方式上。选择正确的行格式可以优化存储空间的使用、加速查询响应时间和提升事务处理性能,但这也需要考虑具体的应用场景和数据特性。

因此,行格式和存储引擎的关系基本上是存储引擎定义了支持哪些行格式,并通过行格式的具体实现来达到其性能和功能目标。在选择存储引擎和行格式时,开发者和数据库管理员需要根据具体需求做出选择,以实现最佳的性能和存储效率。

参考链接

  • InnoDB存储引擎:MySQL 官方文档
  • 行格式说明:MySQL 行格式详解
  • 数据压缩技术:InnoDB压缩技术

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/554483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【进阶六】Python实现SDVRPTW常见求解算法——离散粒子群算法(DPSO)

基于python语言,采用经典离散粒子群算法(DPSO)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4. …

.netcore+vue新生分班系统的设计与实现

.netcore vue新生分班系统的设计与实现说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于.net core架构和mysql数据库vue 东北石油大学新生分班系统的设计与实现 功能模块: 登录 注册学生 忘记密码 系统首顶 个…

fatal error C1001: An internal error has occurred in the compiler

VS2008驱动项目A,集成一个Wzarid生成的驱动LIB项目B,在编译64位驱动时,出现以下错误: 1>------ Build started: Project: xxxx, Configuration: Release x64 ------ 1>Linking... 1>fatal error C1001: An internal error has occu…

AI时代下,普通人能怎么做?

AI玩法千千万,你已经知道了多少呢?是否已经实践起来? 大家好,我是程序员影子 | 全网同名 一名致力于帮助更多朋友快速入门编程的程序猿 今天,我将以小白入门的视角带着大家了解一下目前火热的AI实践玩法&#xff1b…

SQL --索引

索引 INDEX 伪列 伪装起来的列,不容易被看见,要特意查询才能看见 ROWNUM: 是对查询结果自动生成的一组连续的自然数序号。 SELECT emp.*,ROWNUM FROM emp例题:查询emp表中,前三个员工 SELECT * FROM * from emp w…

工业控制(ICS)---MMS

MMS 工控领域的TCP协议,有时wireshark会将response包解析为tcp协议,影响做题,如果筛选mms时出现连续request包,考虑wireshark解析错误,将筛选条件删除手动看一下 initiate(可以理解为握手) i…

QQ浏览器模仿Arc,推垂直工作栏引领新体验潮流|TodayAI

之前在硅谷大受欢迎的AI浏览器Arc一经推出就立即引起了广泛关注,Arc自称不仅仅是一款浏览器,而且还是一个“与互联网同规模的平台”。如今,中国的QQ浏览器也想借Arc的热潮之势,同样采用了类似Arc的垂直工作栏,声称能够…

【总结】jdk安装配置后,执行报错java: error while loading shared libraries: libjli.so

目录 问题现象排查分析解决方法 问题现象 安装jdk后,配置好了环境变量,但执行java -vesion命令时,报错。 java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory 看起来这个…

就业分析丨云计算数通双认证学员,入职海外年薪50W

扫码联系誉天猎头部,可享高薪岗位内推、职业规划岗前测评等服务 誉天,我的职业启航之地 大家好,我是誉天学员万*,回想起那段为梦想而奋斗的日子,我的心中充满了感慨。誉天在行业内一直深受好评,在我心中播下了技能的种…

14.多态(多态的构成条件、虚函数的重写、抽象类也就是纯虚函数的类、虚函数表、单继承和多继承的虚函数表)

1.多态的概念 ​ 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个例子:比如买票这个行为,当普通人买票时,是全价买票;…

java动态代理--JDK代理

1.概述 JDK动态代理:只能代理实现了接口的类,代理对象是实现了目标对象所有接口的代理类 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来创建代理对象,工作通过反射机制完成。 2.实现接口InvocationHandler …

目标检测——防护装备数据集

一、重要性及意义 防护装备中的头盔和背心检测具有至关重要的重要性和深远的意义,主要体现在以下几个方面: 首先,它们对于保护工作人员的人身安全起着至关重要的作用。在各类工作环境中,尤其是那些涉及高空作业、机械操作或交通…

windows10 VS2017 grpc1.48.0环境配置

本文介绍在Windows10 下使用Visual Studio 2017编译gRPC 1.48.0并配置开发环境,以及开发、配置一个简单的c服务端以及客户端。(过程令人头疼,参阅了大量博客,实际操作都存在问题,整理一下,希望对后来者有帮…

每日一练

这是一道牛客的dd爱框框的题 题目解析: 就是求大于x的最短子序列 我的思路:是滑动窗口 public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint n in.…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足,创建了一个计算机管理信息…

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化

时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化 目录 时序分解 | Matlab实现TVF-EMD时变滤波器的经验模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现TVF-EMD(时变滤波器的经验模态分解)可直接替换 Matlab语言 1.…

2024年思维100春季线上赛倒计时2天,快来做思维100历年真题700道

今天是2024年4月18日,距离2024年春季思维100活动第一阶段的线上比赛4月20日还有2天。我们来从历年的思维100真题中来分析和推测,把历年真题和背后的知识点吃透了,举一反三,并建立自己的解题思路和技巧。从而提高思维100的考试成绩…

OSPF星型拓扑和MGRE全连改

一,拓扑 二,要求 1,R6为ISP只能配置IP地址,R1-R5的环回为私有网段 2,R1/4/5为全连的MGRE结构,R1/2/3为星型的拓扑结构, 3,R1为中心站点所有私有网段可以互相通讯,私有网段…

JavaWeb--05Vue项目简介

Vue项目简介 1 创建vue项目2 Vue项目目录结构3 运行Vue项目3 Vue项目开发流程 1 创建vue项目 环境准备好了,接下来我们需要通过Vue-cli创建一个vue项目,然后再学习一下vue项目的目录结构。Vue-cli提供了如下2种方式创建vue项目: 命令行:直接…

基于大数据的手机销售数据分析可视化系统,爬取京东和淘宝的的手机商品数据进行分析,Flask,Python,数据可视化

介绍 该系统主要是通过爬取京东和淘宝的的手机商品数据进行分析。爬虫python脚本通过打开浏览器授权登录后按照搜索“手机”关键字后出现的商品列表进行爬取,获取标题名,解析付款人数,品牌,评论人数,发货地&#xff0…