MySQL中的物理存储结构详解

 更新时间:2025年03月12日 09:56:08   作者:冰糖心书房  
这篇文章主要介绍了MySQL中的物理存储结构用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQL的物理存储结构主要由数据文件、日志文件及存储引擎特定的组织方式构成。以下是其核心组成部分的详细说明:

1. 数据目录结构

MySQL的数据存储在datadir配置指定的目录中,通常包含以下内容:

数据库目录:每个数据库对应一个子目录(如/var/lib/mysql/db_name),内部存放表的结构和数据文件。

表文件:不同存储引擎的表文件类型不同:

  • InnoDB.ibd(独立表空间文件)和.frm(8.0之前的结构文件,8.0后元数据存储在数据字典中)。
  • MyISAM.MYD(数据文件)、.MYI(索引文件)和.frm(结构文件)。
  • Memory引擎:数据仅存储在内存中,无磁盘文件(表结构仍存于.frm)。

2. InnoDB存储引擎的物理结构

InnoDB采用索引组织表(IOT),数据按主键顺序存储,物理结构分层如下:

表空间(Tablespace)

  • 系统表空间(ibdata1):存储数据字典、Undo日志(8.0前)、Change Buffer等。默认包含所有表的数据(若未启用独立表空间)。
  • 独立表空间(.ibd文件):每个表独立存储数据和索引(默认启用),提升管理灵活性。
  • 通用表空间:可存储多个表的数据,通过CREATE TABLESPACE创建。
  • Undo表空间(8.0+):独立存储Undo日志,默认undo_001undo_002
  • 临时表空间:存储临时表和排序操作数据。

存储单元层级

  • 段(Segment):由多个区组成(如数据段、索引段、回滚段)。
  • 区(Extent):由连续64个页构成(默认1MB,每页16KB)。
  • 页(Page):最小磁盘管理单元(16KB),包含页头、行记录、页尾等信息。
  • 行(Row):数据按行格式(如Compact、Dynamic)存储,Dynamic格式处理大字段时仅存储溢出页指针。

日志文件

  • Redo Log(ib_logfile)*:物理日志,记录数据页修改,用于崩溃恢复。
  • Undo Log:逻辑日志,支持事务回滚和MVCC(8.0后存于Undo表空间)。

3. MyISAM存储引擎的物理结构

数据与索引分离:表由三个文件组成:

  • .frm:表结构定义(8.0前)。
  • .MYD:数据文件,按插入顺序存储。
  • .MYI:索引文件,支持全文索引和压缩表。

特性:表级锁、无事务支持,适合读多写少场景。

4. 日志文件

  • 二进制日志(binlog):记录所有数据更改操作,用于主从复制和点恢复。
  • 错误日志(error log):记录服务器运行状态和错误信息。
  • 慢查询日志(slow query log):记录执行时间超过阈值的SQL语句。

5. 内存结构辅助

  • 缓冲池(Buffer Pool):InnoDB缓存数据页和索引,减少磁盘I/O。
  • Change Buffer:缓存非唯一索引的变更,提升写入性能。

版本差异与注意事项

  • MySQL 8.0+:移除.frm文件,元数据存于数据字典(mysql.ibd);默认Undo日志独立。
  • 配置选项innodb_file_per_table控制是否启用独立表空间。
  • 行溢出处理:Dynamic行格式对大字段(如BLOB)仅存储20字节指针,数据存于溢出页。

总结

  • InnoDB:适合事务处理,通过表空间、页结构和日志机制保障ACID。
  • MyISAM:轻量级,适合静态数据,物理结构简单但缺乏事务支持。
  • 日志系统:保障数据持久性和系统可恢复性。

理解物理存储结构有助于优化数据库设计(如选择行格式、分区策略)和故障排查(如分析文件损坏问题)。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • mysql分区表的增删改查的实现示例

    mysql分区表的增删改查的实现示例

    增删查改在数据库中是很常见的操作,本文主要介绍了mysql分区表的增删改查的实现示例,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • Mysql的备份与恢复全过程(使用XtraBackup)

    Mysql的备份与恢复全过程(使用XtraBackup)

    xtrabackup是MySQL的物理备份工具,比mysqldump更快,安装时需选择适合MySQL版本的PerconaXtraBackup,备份分为全量和增量,恢复时需停服务,清空数据目录,按全量和增量恢复,最后准备备份并启动服务,注意MySQL8.0的特殊配置和权限设置
    2026-01-01
  • mysql alter table命令修改表结构实例

    mysql alter table命令修改表结构实例

    这篇文章主要介绍了mysql alter table命令修改表结构实例的相关资料,需要的朋友可以参考下
    2016-10-10
  • mysql_fetch_row()与mysql_fetch_array()的使用介绍

    mysql_fetch_row()与mysql_fetch_array()的使用介绍

    本篇文章是对mysql_fetch_row()与mysql_fetch_array()的使用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL8中误删数据恢复的7种方法完整指南

    MySQL8中误删数据恢复的7种方法完整指南

    在数据库管理中,误删数据是开发者和运维人员最恐惧的噩梦之一,本文将通过 5个核心步骤、7种恢复方法 和 12个实战代码示例,深度解析MySQL 8中误删数据的恢复策略,大家可以根据需要进行选择
    2025-09-09
  • 浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    浅谈MySQL存储引擎选择 InnoDB与MyISAM的优缺点分析

    MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的
    2013-06-06
  • MySQL的安全问题从安装开始说起

    MySQL的安全问题从安装开始说起

    本篇文章小编为大家介绍,关于MySQL的安全问题从安装开始说起,有需要的朋友可以参考一下
    2013-04-04
  • 一文了解MySQL的四大子查询

    一文了解MySQL的四大子查询

    本文主要介绍了一文了解MySQL的四大子查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 部署MySQL8.0环境全过程

    部署MySQL8.0环境全过程

    本文详细介绍了如何下载、安装和配置MySQL 8.0,包括选择合适的安装文件、安装过程中的各种选项和配置步骤,以及配置MySQL环境变量以便在命令行中使用MySQL命令
    2025-10-10
  • mysql三种批量增加的性能分析

    mysql三种批量增加的性能分析

    最近在深入学习hibernate,在进行批量操作时,发现hibernate批量操作性能非常低.于是就想找一个性能较高的方法,在对jdbc、jdbcTemplate、hibernate进行测试后,发现jdbc的执行效率是最高的,jdbcTemplate也很相近,hibernate就不考虑了,惨不忍睹啊
    2012-08-08

最新评论