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

在这里插入图片描述

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

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

相关文章

Nginx的ssl证书配置

http协议数据传输都是明文的。 https是httpssl,ssl是加密协议,通过证书来加密,安装了证书的网站才会用https来交互。 # 再nginx的配置文件的server这中配置 server {#listen 80;listen 443 ssl; #http默认端口是80, …

爬虫f12跳转和debugger检测

在空白页面的控制台运行解决重定向再复制url到网页 //解决重定向 (() > {window.onbeforeunload ()>{debugger;return false;}})();//构造方法无限debugger (() > {Function.prototype.constructor Function.prototype.constructor;Function.prototype.constructor…

nacos 2022.0.0.0 版本实现负载均衡及集群

一、loadbalancer实现负载均衡 新版本的nacos已经取消了对ribbon的支持&#xff0c;所以不能使用ribbon来实现nacos提供的负载均衡。 但是新版本中我们可以使用loadbalancer实现负载均衡。 二、导入loadbalancer坐标 1、原本的坐标&#xff1a; 在parent的pom.xml中 <p…

Python 学习笔记(十一)—— 异常处理

目录 一、异常简介 二、捕获异常 2.1 捕获特定类型的异常 2.2 捕获多个类型的异常 2.3 捕获所有类型的异常 2.4 使用多个except块处理不同类型的异常 三、异常的传递 3.1 异常在函数内部引发&#xff0c;并在函数外部捕获 3.2 异常在多层函数调用中传递 3.3 异常在类…

耐高温300度锅炉轴承,江苏鲁岳轴承制造的行业标杆

自润滑轴承-产品类型-耐高温轴承-不锈钢轴承-江苏鲁岳轴承制造有限公司。锅炉轴承&#xff0c;耐高温至200度-800度。 江苏鲁岳轴承制造有限公司&#xff0c;一家专注于锅炉轴承和耐高温轴承的研发与生产的企业&#xff0c;致力于为客户提供高质量、高性能的轴承解决方案。其中…

使用 OpenCV 测量物体尺寸

使用 OpenCV 测量物体尺寸 你是否曾经遇到过这样的问题&#xff1a;想要知道计算器的精确尺寸&#xff0c;但手头又没有专业的测量工具&#xff1f;别担心&#xff0c;今天我们就来教大家一个简单又实用的方法&#xff0c;通过一张A4纸就能估算出计算器的宽度和高度&#xff0c…

笔记:Python 选择结构练习题

文章目录 前言一、选择结构 是什么&#xff1f;二、练习题1.选择题2.填空题 总结 前言 选择结构在编程中扮演着至关重要的角色&#xff0c;它允许程序根据条件的满足与否选择不同的路径执行代码。在Python中&#xff0c;我们通常使用if语句来实现选择结构。if语句允许我们根据…

iZotope RX 10 音频修复和增强工具 mac/win

iZotope RX 10 for Mac是一款出色的音频修复和增强工具&#xff0c;凭借其卓越的音频处理技术&#xff0c;能够轻松应对各种音频问题。 无论是背景噪音、回声还是失真&#xff0c;RX 10都能精准去除&#xff0c;还原清晰纯净的音频。同时&#xff0c;它还提供了丰富的增强工具&…

【Linux系统编程】第六弹---权限的概念

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是权限 2、权限的本质 3、Linux中的用户 4、Linux中文件的权限 4.1、文件访问者的分类(角色) 4.2、文件类型和访问权…

算法刷题记录 Day52

算法刷题记录 Day52 Date: 2024.04.20 lc 84. 柱状图中最大的矩形 // 单调栈 class Solution { public:int largestRectangleArea(vector<int>& heights) {// 对于每个柱子&#xff0c;我们考虑按当前柱子进行中心扩散&#xff0c;直到找到其左侧及其右侧&#xf…

Python 全栈安全(三)

原文&#xff1a;annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十一章&#xff1a;OAuth 2 本章内容 注册 OAuth 客户端 请求对受保护资源的授权 授权而不暴露身份验证凭据 访问受保护的资源 OAuth …

人脑是怎么防止梯度消失和梯度爆炸的

人脑是怎么防止梯度消失和梯度爆炸的? 神经网络&#xff0c;也称为人工神经网络 (ANN) 或模拟神经网络 (SNN)&#xff0c;是机器学习的子集&#xff0c;并且是深度学习算法的核心。其名称和结构是受人类大脑的启发&#xff0c;模仿了生物神经元信号相互传递的方式。 感觉这个问…

亚马逊---设计安全架构

会从以下三个方面展开&#xff1a; 1、AWS资源访问安全 2、应用程序负载的网络安全 3、云中数据的安全 责任共担模式 就像租房子&#xff08;房东和你的责任&#xff09; AWS资源访问安全 需要掌握以下几点&#xff1a; 1、跨多个账户的访问控制和管理 2、AWS联合访问和身份服…

SpringMVC--RESTful

1. RESTful 1.1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表现层资源状态转移。 RESTful是一种网络架构风格&#xff0c;它定义了如何通过网络进行数据的交互。这种风格基于HTTP协议&#xff0c;使得网络应用之间的通信变得更加简洁和高效。…

力扣283. 移动零

Problem: 283. 移动零 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int类型变量index初始化为0&#xff1b; 2.遍历nums当当前的元素nums[i]不为0时使nums[i]赋值给nums[index]&#xff1b; 3.从index开始将nums中置对应位置的元素设为0&#xff1b; 复杂度 时间…

Java 异常处理详解

Java异常是Java编程语言中用于表示程序运行时错误的一种机制。Java异常体系通过异常类和异常处理来实现&#xff0c;允许程序在遇到预期或意外情况时&#xff0c;优雅地处理问题&#xff0c;而不是立即终止程序运行。 异常类层次结构 Java异常类都继承自java.lang.Throwable类…

【架构】负载均衡SLB浅谈

SLB负载均衡架构培训文档 1. 引言 作为一名架构师&#xff0c;理解并掌握SLB&#xff08;Server Load Balancer&#xff09;负载均衡架构是非常重要的。本培训文档旨在为您提供关于SLB负载均衡架构的详细知识和指导&#xff0c;帮助您更好地设计和优化企业级应用。 2. SLB负…

python爬虫--------requests案列(二十七天)

兄弟姐们&#xff0c;大家好哇&#xff01;我是喔的嘛呀。今天我们一起来学习requests案列。 一、requests____cookie登录古诗文网 1、首先想要模拟登录&#xff0c;就必须要获取登录表单数据 登录完之后点f12&#xff0c;然后点击network&#xff0c;最上面那个就是登录接口…

Spring AI Summary

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Spring AI is a project that aims to streamline the development of AI applications by providing abstractions and reusable components that can be easily integrate…

Java面试题:描述Java中的链式调用是如何实现的?

链式调用&#xff08;Chain of Responsibility&#xff09;是一种行为型设计模式&#xff0c;它允许你通过创建一个对象的序列来处理请求&#xff0c;每个对象处理请求后&#xff0c;将请求传递给下一个对象&#xff0c;直到请求被完整处理。这种模式通常用于简化对象之间的连接…