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 使用存储过程实现树节点的获取方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • SQL中写入包含有英文单引号“ '''' ”失败问题深入详解

    SQL中写入包含有英文单引号“ '''' ”失败问题深入详解

    这篇文章主要介绍了SQL中写入包含有英文单引号“ ' ”失败问题深入详解,列举了具体实例讲解,有感兴趣的同学可以研究下
    2021-03-03
  • 关于Mysql查询带单引号及插入带单引号字符串问题

    关于Mysql查询带单引号及插入带单引号字符串问题

    本文主要介绍的是用mysql_real_escape_string对用户提交的表单数据进行转义处理和通过addslashes以及mysql_escape_string这3个类似功能的函数用法区别
    2013-04-04
  • mysql多表join时候update更新数据的方法

    mysql多表join时候update更新数据的方法

    如果item表的name字段为''就用resource_library 表的resource_name字段前面加上字符串Review更新它,他们的关联关系在表resource_review_link中。
    2011-03-03
  • MySQL索引查询的具体使用

    MySQL索引查询的具体使用

    本文主要介绍了MySQL索引查询的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • MySQL中Union子句不支持order by的解决方法

    MySQL中Union子句不支持order by的解决方法

    这篇文章主要介绍了MySQL中Union子句不支持order by的解决方法,结合实例形式分析了在mysql的Union子句中使用order by的方法,需要的朋友可以参考下
    2016-06-06
  • MySQL中的物理存储结构详解

    MySQL中的物理存储结构详解

    这篇文章主要介绍了MySQL中的物理存储结构用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • MySQL表数据文件损坏导致数据库无法启动的原因与解决方案

    MySQL表数据文件损坏导致数据库无法启动的原因与解决方案

    在日常的数据库管理中,遇到MySQL表数据文件损坏的情况并不罕见,这种情况下,MySQL数据库可能会无法正常启动,给业务运行带来严重影响,本文将探讨如何诊断和解决MySQL表数据文件损坏导致的数据库无法启动问题,需要的朋友可以参考下
    2025-03-03
  • MySQL数据库三种常用存储引擎特性对比

    MySQL数据库三种常用存储引擎特性对比

    MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平并且最终提供广泛的不同功能和能力。在MySQL中将这些不同的技术及配套的相关功能称为存储引擎。
    2016-01-01
  • MySQL中的自定义函数(CREATE FUNCTION)

    MySQL中的自定义函数(CREATE FUNCTION)

    这篇文章主要介绍了MySQL中的自定义函数(CREATE FUNCTION),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论