了解MyISAM记录结构

2023-11-24

我试图了解 MyISAM 如何物理存储其记录以及在记录插入和删除记录后如何维护其结构。我已阅读以下链接:

  • MyISAM 动态数据文件布局
  • MyISAM记录结构

我想确认一下我的理解是否正确,如果不对请指正。

固定大小的记录

MyISAM fixed-size record

  • 删除标记决定记录是否被删除。
  • 记录头保存行中哪一列包含NULL值
  • 数据的长度是固定的。

可变大小的记录

enter image description here

  • 删除标记替换为 BLOCK_DELETED 块类型
  • 记录头保存数据长度和未使用数据的长度

enter image description here

  • 单个记录可以被分成多个通过溢出指针连接的块。

Deletion

enter image description here

  • 对于可变大小的记录,将块类型更改为 BLOCK_DELETED
  • 通过让新删除的记录的前一个指针指向最后删除的记录,维护所有已删除记录的双链表。然后,最后删除的记录的下一个指针指向新删除的记录。
  • 对于固定大小的记录,只需将删除标记更改为已删除即可。 (不确定他们是否使用双链表将所有已删除的记录与固定大小的记录连接起来)

插入

  • 如果没有未使用的空间(已删除的记录),则将数据追加到文件末尾
  • 如果有未使用的空间适合新插入的记录,则在那里写入新记录。
  • 如果未使用的空间远大于新插入的记录,则分为两条记录:新记录和删除的记录。
  • 如果有未使用的空间小于新插入的记录,则在那里写入数据,并有溢出指针指向其他块中未容纳的数据。

Updating

  • 如果用户用更长的数据更新现有数据怎么办? MyISAM 会将记录标记为已删除并找到适合新数据的位置还是简单地使用溢出指针指向不适合的数据?

再次回顾一下问题

我想确认一下我的理解是否正确,如有请指正 这是不对的。

其他问题

  • 如果表被多次删除和插入,记录结构可能会充满溢出指针和未使用的空间,效率是否会非常低?

您在有关 MyISAM 的问题中获得的信息是正确的。不过,我想回答你的另外两个问题:

最新问题

如果用户用更长的数据更新现有数据怎么办? MyISAM 会将记录标记为已删除并找到适合新数据的位置还是简单地使用溢出指针指向不适合的数据?

根据the Book

sdkm

第 10 章:“存储引擎”第 196 页第 7 段说

对于可变长度的记录,格式更复杂。第一个字节包含描述记录子类型的特殊代码。后续字节的含义因每个子类型而异,但共同的主题是存在一个字节序列,其中包含记录的长度、块中未使用的字节数、NULL 值指示符标志,以及可能指向的指针如果记录不适合先前创建的空间并且必须拆分,则记录的延续。当一条记录被删除,并且要插入到其位置的新记录超过原始记录的大小时,就会发生这种情况。您可以通过研究storage/myisam/mi_dynrec.c中的switch语句in_mi_get_block_info()来详细了解不同代码的含义。

根据该段落,仅当要插入的新数据无法放入先前分配的块中时,旧记录才会被链接数据覆盖。这可能会导致许多行臃肿。

附加问题

如果表被多次删除和插入,记录结构可能会充满溢出指针和未使用的空间,效率是否会非常低?

从我之前的回答来看,会有很多块

  • 空间块
  • 记录的长度
  • 块中未使用的字节数
  • NULL 值指示标志
  • 如果记录不适合先前创建的空间并且必须拆分,则可能是指向记录延续的指针

此类记录链接将从插入超大数据的每一行的前面开始。这会使 MyISAM 表膨胀.MYD归档速度非常快。

建议

MyISAM 的默认行格式是动态的。当表是动态的并且经历大量 INSERT、UPDATE 和 DELETE 时,这样的表需要通过以下方式进行优化:

OPTIMIZE TABLE mytable;

还有一种替代方法:将表的行格式切换为“固定”。这样,所有行的大小都相同。这是固定行格式的方法:

ALTER TABLE mytable ROW_FORMAT=Fixed;

即使使用固定行格式,也必须花费时间来查找可用记录,但时间将是 O(1) 搜索时间(通俗地说,无论有多少行,查找可用记录所需的时间都是相同的)该表有或有多少已删除的行)。您可以通过启用来绕过该步骤并发插入如下:

将其添加到 my.cnf

[mysqld]
concurrent_insert = 2

不需要重新启动 MySQL。赶紧跑

mysql> SET GLOBAL concurrent_insert = 2;

这将导致所有 INSERT 都转到表的后面而不寻找可用空间。

固定行表的优点

  • INSERT、UPDATE 和 DELETE 会更快一些
  • SELECT 速度快 20-25%

以下是我关于 SELECT 因行格式被修复而速度更快的一些帖子

  • May 03, 2012 : InnoDB 和 MyISAM 哪个更快?
  • Sep 20, 2011 : MyISAM 和 InnoDB 的优点
  • May 10, 2011 : 在固定大小字段上使用 CHAR 与 VARCHAR 对性能有何影响?

固定行表的缺点

大多数情况下,当你跑步时ALTER TABLE mytable ROW_FORMAT=Fixed;,该表可能会增长 80-100%。这.MYI文件(MyISAM 表的索引页)也会以相同的速度增长。

EPILOGUE

如果您想要 MyISAM 表的速度并且可以使用更大的表,则需要我的替代建议。如果要为每个 MyISAM 表节省空间,请保持行格式不变(动态)。您必须使用以下命令来压缩该表OPTIMIZE TABLE mytable;更频繁地使用动态表。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解MyISAM记录结构 的相关文章

  • jsp/servlet 从数组填充下拉框

    大家好 我正在尝试创建一个表单 允许您为某个主题创建一个实验室 它有一个下拉框 您可以在其中选择与该用户相关的主题 但是 当我去加载页面时 我收到此错误g apache jasper JasperException java lang Nu
  • 主机 localhost 不允许连接到此 MySQL 服务器 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不小心删除了我的用户表 删除了所有用户 现在每当我尝试访问我的数据库时 它都会说 主机本地主机不允许连接到此 MYSQL 服务器 我试过
  • Google BigQuery 底层架构

    所以我大约 10 分钟前才开始摆弄 Google BigQuery 我想知道是否有人知道他们用来存储数据的底层架构 例如 这只是他们自己的下一代 BigTable 基础设施吗 另外 他们在索引 索引重建等方面使用什么样的策略是否清楚 我只是
  • mysql 使用什么样的哈希?

    我正在编写类似于 phpMyAdmin 的自己的代码 但我需要用户能够使用 mysql 数据库中的用户名和密码登录 我需要知道mysql数据库使用什么样的哈希来存储每个用户的密码 我检查了 dev mysql com 寻找答案 但除了以 开
  • 如何使用外连接和分组依据在查询中包含 NULL 值

    我有两个表 其中包含以下示例数据 Table 1 item name item id item desc 1 apple 2 orange 3 banana 4 grape 5 mango Table 2 user items user i
  • 是否可以更新 amazon dynamodb 中的哈希键?

    我想更新 amazon dynamodb 表中的哈希键值 我在同一张表中也有一个范围键 是否有可能做到这一点 您无法更新哈希键值 您必须删除并重新创建该项目 这是相关的aws文档http docs aws amazon com amazon
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • DBX 错误:驱动程序无法正确初始化

    我在跑步德尔福XE3 终极版 MySQL 数据库 这是我点击时收到的错误Test Connection 作为回应 我在 xampp 目录中找到了 libmysql 库 并将其复制到我的 System32 目录中 但这是行不通的 此消息指的是
  • Wordnet sqlite 同义词和示例

    我正在尝试获取给定 wordid 的同义词和示例列表 经过大量的试验和错误 我可以获得所有同义词集的样本 但不是实际的同义词 这是我的查询 它给出了以下结果 select senses wordid senses synsetid sens
  • 无法从 Web 主机本身以外的任何地方连接到任何 Web 主机的 MySQL 数据库

    我有 2 个不同的虚拟主机 pagodabox 000webhost 都是免费的 并且我已经设置了localhost与MySQL 我已经在他们三个上安装了 wordpress 它们在自己的域中工作得很好 即 什么时候localhostwor
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • MySQL - 从另一个表插入与常量合并的数据

    我有一个包含一些数据的临时表 products temp 并且我有另一个需要将数据插入其中的表 产品 我需要在新记录上手动设置一些常量 例如vendor id 1等 是否可以在一次请求中插入临时表数据和常量 临时产品 product nam
  • 关于 Cassandra 与 MySQL 的一些建议

    几天前我在这里问了一个问题 得到了一些非常好的答案 我正在考虑做一个带有个人资料 个人简介等的facebook风格的网站 并询问我是否应该使用mysql 答案是使用Cassandra 因为好多了 我只是问这是每个人都会建议的 只是我对mys
  • 调整 Oracle 数据库以加快启动速度(闪回)

    我正在使用 Oracle 数据库 11 2 我有一个场景 我发出FLASHBACK DATABASE经常 似乎有一个FLASHBACK DATABASECycle 会重新启动数据库实例 大约需要 1 分钟 我的设置花了 7 秒 数据库很小
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • MySQL如何从多个表中获取数据

    我正在寻找 php MySQL jquery 的帮助 我有2张桌子 table1表 1 有 4 列 id 标题 desc thumb img tabel2表 2 有 3 列 id 表 id img 我只想将 2 个表与 get QS 的值进
  • RESTful API:我应该在哪里编码我的工作流程?

    我正在开发一个 RESTful API 这是我的第一个 API 也是我的第一个真正大型的编码项目 因此 我仍在学习很多关于建筑等方面的知识 目前 我的 api 设置分为以下几层 HTTP层 资源层 领域模型 业务逻辑层 数据访问 存储层 持
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 无法创建 Android 模拟器:无法解析 AVD 配置文件

    无头 Linux 64 位 Jenkins 正在尝试创建 Android 模拟器 但因以下设置而失败 android Using Android SDK opt android sdk linux android Creating Andr
  • 为什么我必须先使用 strcpy(),然后再使用 strcat()?

    为什么此代码会产生运行时问题 char stuff 100 strcat stuff hi strcat stuff there 但这不是吗 char stuff 100 strcpy stuff hi strcat stuff there
  • 扫描仪仅读取第一个单词而不是行

    在我当前的程序中 一种方法要求用户输入产品的描述作为String输入 但是 当我稍后尝试打印此信息时 只有该信息的第一个单词String显示 这可能是什么原因造成的 我的方法如下 void setDescription Product aP
  • 如何覆盖嵌套的 NPM 依赖项版本?

    我想使用grunt contrib jasmineNPM 包 它有各种依赖关系 部分依赖关系图如下所示 email protected email protected email protected 不幸的是 这个版本有一个错误phanto
  • SciKit-Learn 标签编码器导致错误“参数必须是字符串或数字”

    我有点困惑 在这里创建一个 ML 模型 我正处于尝试从 大 数据帧 180 列 中获取分类特征并对其进行单热处理的步骤 以便我可以找到特征之间的相关性并选择 最佳 特征 这是我的代码 import labelencoder from skl
  • 在python中使用beautifulsoup解析html时<>更改为<和>

    使用 Beautifulsoup 处理 html 时 被转换为 lt and gt 由于标签锚全部转换 整个汤失去了结构 有什么建议吗 Setting formatter None可能有帮助 http www crummy com soft
  • 窗口加载和 WPF

    我在 Windows 2012 中有一个 WPF 项目 我需要在 Window Loaded 事件中加载一些信息 不过 我需要在视图模型中而不是在代码隐藏中执行此操作 我正在尝试使用以下代码 在我的 xaml 中
  • Visual Studio添加与dll同名的可执行文件

    在 Visual Studio 2008 中 我添加了 WinScp dll 在项目根目录中 作为引用 并且立即出现了一个黄色图标 在编译时 找不到类型或命名空间名称 WinSCP 是否缺少 using 指令或程序集引用 已解决的文件图像错
  • AVPlayerItem 失败,并显示 AVStatusFailed 和错误代码“无法解码”

    我遇到了一个奇怪的问题 希望有人能帮忙 在我的 iOS 应用程序中 我使用以下命令创建带有自定义配乐的视频MutableComposition通过组合用户照片库中的视频和应用程序包中的音频文件 然后我用一个AVPlayer and AVPl
  • 使用 NLog 记录波斯语消息

    在我的 ASP NET MVC 项目中 我在 Web config 中有以下配置
  • Android 工具栏后退箭头,带有 WhatsApp 等图标

    如何在 Android 工具栏中显示带后退箭头的图标 如 WhatsApp 我使用下面的代码在工具栏中设置后退箭头和图标 toolbar Toolbar findViewById R id toolbar setSupportActionB
  • JQuery Ajax 在 url 中添加哈希

    我这里有使用 struts2 jquery 插件的代码 h4 Choose A task h4 ul ul
  • Pandas:与之前值的差异

    给定一个看起来像这样的 Pandas 数据框 GROUP VALUE MASK 1 5 false 2 10 false 2 20 false 1 7 true 3 17 false 3 18 false 1 100 false 1 200
  • Ktor - 静态内容路由

    我很想更好地了解 Ktor 如何处理静态内容的路由 我的静态文件夹 工作目录 中有以下层次结构 static index html some files static css directory js directory some file
  • 如何创建和访问会话.net core api?

    我需要在 api 中创建并访问会话 例如 我有一个名为 Login Profile 的 api 当登录 api 被调用时 我需要创建会话 并且我需要访问配置文件 api 中的会话 当会话被清除时 登录和配置文件 api 不允许用户访问 怎么
  • 检查 Swift 字典是否不包含任何值?

    所以我正在制作一个待办事项列表应用程序 我希望用户在所有购物项目都被删除时收到通知 我有一个字典 其中包含 String store 作为键和 String items 作为值 有没有一种快速方法来检查所有项目的数组是否为空 有一个简单的方
  • Android Drawable 内存泄漏

    我使用几个大型绘图 但不知道如何管理内存泄漏 我跟踪了应用程序的堆大小 它不会停止增长 与分配的内存一样 尤其是 字节数组 byte 类型 它只会增长且永不减少 在 Eclipse 上的 DDMS 堆视图中 我的应用程序由一个使用片段的活动
  • 如何从正在运行的 QThread 向启动它的 PyQt Gui 发送信号?

    我试图了解如何使用从 Qthread 发送回启动的 Gui 界面的信号 设置 我有一个进程 模拟 需要几乎无限期地运行 或至少运行很长一段时间 在运行时 它会执行各种计算 并且某些结果必须发送回GUI 它将实时适当地显示它们 我使用 PyQ
  • 如何使 Qt Creator 的调试器在 OS X 中显示 C++ 矢量的内容?

    我正在编写一个广泛使用向量的程序 并且是第一次在 Mac OS X 10 6 6 上使用 Qt Creator 2 0 1 进行开发 当我调试时 我可以在Locals and Watchers窗口 但是一旦我去扩展一个向量 在这种情况下类型
  • 了解MyISAM记录结构

    我试图了解 MyISAM 如何物理存储其记录以及在记录插入和删除记录后如何维护其结构 我已阅读以下链接 MyISAM 动态数据文件布局 MyISAM记录结构 我想确认一下我的理解是否正确 如果不对请指正 固定大小的记录 删除标记决定记录是否