MySQL行格式(row format)

news2024/12/24 3:40:40

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压缩技术

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

京西商城——前端项目的创建以及前后端联调

创建VUE项目 在jingxi_shop_project文件夹中再创建一个 frontend 文件夹用来存放前端项目 /jingxi_shop_project/backend/jingxi_shop_project....../frontend/jingxi_shop_web......首先要安装 node.js 和 VUE cli,进入到项目目录内创建项目 vue create jingxi_…

[Vision Board创客营]学习片上Flash移植FAL

文章目录 [Vision Board创客营]学习片上Flash移植FAL介绍环境搭建使用组件测试porbeerasewriteread 结语 [Vision Board创客营]学习片上Flash移植FAL 水平较菜,大佬轻喷。😰😰😰 介绍 🚀🚀Vision-Board 开…

解锁流量密码:如何利用HubSpot打造高效的获客策略?(下)

在当今数字化时代,流量是企业成功的关键。HubSpot作为一款全面的营销自动化工具,为我们提供了强大的支持,帮助企业打造高效的流量获取策略。接下来,我们将从社交媒体与SEO优化、自动化营销流程、数据分析与效果评估以及流量获取策…

【R语言】组合图:散点图+箱线图+平滑曲线图+柱状图

用算数运算符轻松组合不同的ggplot图,如图: 具体代码如下: install.packages("devtools")#安装devtools包 devtools::install_github("thomasp85/patchwork")#安装patchwork包 library(ggplot2) library(patchwork) #p1是…

Linux进程和任务管理

目录 一.程序和进程的关系 程序 进程 线程 线程与进程的区别 二.查看进程信息ps 方法一 常用选项 方法二 三.TOP动态查看进程信息 进程信息区各列解释 top常用命令 系统查看命令总结 查看进程信息pgrep 查看进程树pstree 四.控制进程 进程的启动方式 进程的前…

electron的webview和内嵌网页如何通信

在 Electron 的世界里,webview 标签相当于一个小盒子,里面可以装一个完整的网页,就像一个迷你浏览器。当你想和这个小盒子里的内容说话时(也就是进行通信),这里有几个方法可以帮你做到: 这里只写…

LIUNX文件系统

目录 1.磁盘的物理结构 2.CHS定位法 3.磁盘的逻辑存储 4.系统层面 inode.block[15] 创建文件的流程 查找文件的流程 了解文件系统,首先要了解磁盘是如何存储和读取数据的。 1.磁盘的物理结构 可以理解这个盘上有很多的小磁铁,通过旋转盘面和摆动…

LeetCode-热题100:114. 二叉树展开为链表

题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

内业减少80%人工操作,林地地形轻松测!

林业作为维护生态平衡和保护环境的关键领域,其科学管理和合理利用是当前林业工作的重中之重。林业调查旨在全面了解当前林业资源的状况,其中林地地形测量是林业调查的基础工作。通过对林地地形的准确测量,可获取森林的地理位置、面积、地貌、…

探索VR数字展厅,对企业未来展示新模式

在数字化浪潮的推动下,企业展示也在经历着一场革命,VR数字展厅正在以一种全新的方式重塑我们的生活和工作空间,不仅重塑了客户的观展体验,也为企业营销打开了新的渠道。 VR数字展厅作为实体展厅的数字化延伸,正以其沉浸…

C++笔记:引用

目录 概念: ​编辑 引用的特性: 引用中的权限问题: 引用与指针的区别: 引用的使用: 概念: 引用是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间。 引用的符号:&…

物联网网络传输,STM32和ESP32

2024.4.17 今天主要是记录一下我这个STM32F407和esp8266组成的互联网板子的一些例程运行心得, 下面这个例程是STM32发AT指令给esp8266,使得esp8266作为tcp client连接到我的手机热点,然后我用电脑连接wifi,打开tcp server&#x…

上海晋名室外气瓶暂存柜海盐项目落地

上周海盐县人民医院武原分院的SAVEST室外气瓶暂存柜项目成功交付验收,此次项目主要用于医院气瓶等室外暂存安全。 用户单位在日常工作运营中涉及到氧气瓶、杜瓦罐等室外安全储存问题,用户在寻找解决方案的过程中搜索到上海晋名的室外气瓶暂存柜系列后挺感…

贪心问题:134. 加油站

https://leetcode.cn/problems/gas-station/ 贪心算法还没找到规律,记录一下该题的思路吧。。。 每个加油站的剩余量rest[i]为gas[i] - cost[i]。 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈,说明 各个站点的加油站 剩油量rest[i]相加一定…

【AI学习中常见专业英文缩写词的解释】

前言: 为了看着不无聊,文中插入了一些AI生成的狗图片 AI(Artificail Intelligence)人工智能: 让机器模拟和展示人类智能的技术。 GAI(Generative Artificail Intelligence)生成式人工智能: 利用复杂的算法、模型和规则,从大规…

19.leetcode---设计循环队列(Java版)

题目链接:https://leetcode.cn/problems/design-circular-queue/ 题解: 代码: 测试:

LeetCode 506.和为K的子数组

目录 题目描述 方法一 三重循环暴力 思路: 代码: 方法二 暴力一点点前缀和 思路: 代码: 方法三 前缀和哈希表 思路: 代码: 题目描述 给你一个整数数组 nums 和一个整数 k ,请你统计并…

超净实验室用耐强酸碱耐高温PFA酸缸进口透明聚四氟塑料方槽

PFA清洗槽是四氟清洗桶后的升级款,主要用于半导体光伏光电等行业,一体成型,无需担心漏液,表面光滑无毛刺。 别名PFA浸泡桶、PFA酸缸、PFA方槽等,可定制尺寸,可配套盖子,盖子有PFA/PTFE两种材质…

idea连接Docker数据库

我们在docker下创建了数据库,想要更方便的查看和操作该数据库,idea和DataGrip或者其他人家都可以。在数据库连接时需要填写数据库名字,主机,端口,数据库用户名和密码。 输入之后先不要点击OK和按Enter键,我…

HubSpot流量开发常见问题及解决方案

在HubSpot流量开发过程中,企业和营销团队可能会遇到一系列问题。本文旨在梳理这些常见问题,并提供相应的解决方案,帮助大家顺利推进HubSpot流量开发项目。 一、数据集成问题 问题:如何将外部数据源与HubSpot集成,实现…