博客
关于我
MySQL底层概述—2.InnoDB磁盘结构
阅读量:794 次
发布时间:2023-02-12

本文共 1705 字,大约阅读时间需要 5 分钟。

InnoDB 存储结构深入解析

InnoDB 是 MySQL 中最常用的关系数据库引擎,其核心存储结构设计非常高效。以下将从基础到高级功能,全面解析 InnoDB 的存储结构。


1. InnoDB 磁盘结构

InnoDB 的磁盘主要包含以下几个关键组件:

  • 表空间 (Tablespaces)
    • 包括系统表空间、独立表空间、撤销表空间、临时表空间等多种类型。
  • InnoDB 数据字典 (Data Dictionary)
    • 存储数据库表、索引和其他元数据信息。
  • 双写缓冲区 (Double Write Buffer)
    • 用于解决部分页失效问题,确保数据写入磁盘的可靠性。
  • 重做日志 (Redo Log)
    • 记录数据库事务的修改操作,保障事务的持久性。
  • 撤销日志 (Undo Log)
    • 记录事务回滚所需的信息,保证事务的原子性。

2. 表空间 (Tablespaces)

2.1 系统表空间 (System Tablespace)

  • 包含 InnoDB 数据字典、双写缓冲区、撤销日志等核心组件。
  • 默认路径为 ibdata1,大小可通过 innodb_data_file_path 参数配置。

2.2 独立表空间 (File-Per-Table Tablespaces)

  • 每个表拥有独立的数据文件,文件名为 .ibd,默认存储于数据库目录。
  • 使用 innodb_file_per_table 参数启用。

2.3 常规表空间 (Regular Tablespaces)

  • 通用表空间,支持多个表共享,文件大小可自动扩展。

2.4 撤销表空间 (Undo Tablespaces)

  • 存储撤销日志,用于事务回滚。
  • 默认存储于系统表空间中,8.0 版本后可配置独立存储。

2.5 临时表空间 (Temporary Tablespaces)

  • 存储临时表和磁盘内部临时表。
  • 8.0 版本后默认存储于 ibtmp1 文件中。

3. 数据字典 (Data Dictionary)

3.1 MySQL 8.0 之后

  • 数据字典信息存储在 InnoDB 系统表空间中,不再依赖 .frm 文件。
  • 提供原子 DDL 操作,提升数据一致性。

4. 双写缓冲区 (Double Write Buffer)

4.1 什么是双写缓冲区?

  • InnoDB 在写入数据时,先将脏页存入双写缓冲区,再写入磁盘。
  • 确保数据写入可靠,防止磁盘故障导致数据丢失。

4.2 数据双写流程

  • 写入缓冲池中的脏页。
  • 复制脏页至双写缓冲区。
  • 按顺序写入磁盘。
  • 写入各表独立表空间。
  • 4.3 为什么写两次?

    • 第一次顺序写入共享表空间。
    • 第二次随机写入独立表空间,确保数据完整性。

    5. 重做日志 (Redo Log)

    5.1 WAL 机制

    • 写前日志(Write-Ahead Logging),确保数据持久性。

    5.2 重做日志格式

    • 物理日志:记录具体数据页修改。
    • 逻辑日志:记录事务操作的逻辑。

    5.3 重做日志写入机制

    • 将日志缓冲区内容写入磁盘,确保数据持久性。
    • 支持多个文件组,循环使用。

    6. 撤销日志 (Undo Log)

    6.1 作用

    • 提供事务回滚和多版本控制(MVCC)。
    • 记录事务开始前的数据状态。

    6.2 工作原理

    • 事务提交前记录数据变化。
    • 事务回滚时利用撤销日志恢复数据。

    7. 二进制日志 (Binlog)

    7.1 基本概念

    • 记录数据库更新操作,用于主从复制和数据恢复。

    7.2 模式

    • ROW 模式:记录每行数据修改。
    • STATEMENT 模式:记录 SQL 语句。
    • 混合模式:结合 ROW 和 STATEMENT 模式。

    7.3 写入机制

    • 写入缓冲区 → 系统缓存 → 磁盘。
    • 支持异步和同步刷盘。

    8. 新版本特性

    8.1 MySQL 5.7

    • 支持独立撤销表空间和临时表空间。
    • 动态调整 Buffer Pool 大小。

    8.2 MySQL 8.x

    • 数据字典和撤销日志完全分离。
    • 临时表空间支持多文件和索引。
    • Double Write Buffer 从共享表空间中分离。

    InnoDB 的存储结构设计充分体现了高可用性和高扩展性,适用于大规模数据存储和高并发场景。

    转载地址:http://uydfk.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(33)——阿里云centos配置MySQL主从复制
    查看>>
    Mysql学习总结(35)——Mysql两千万数据优化及迁移
    查看>>
    Mysql学习总结(36)——Mysql查询优化
    查看>>
    Mysql学习总结(37)——Mysql Limit 分页查询优化
    查看>>
    Mysql学习总结(38)——21条MySql性能优化经验
    查看>>
    Mysql学习总结(39)——49条MySql语句优化技巧
    查看>>
    Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
    查看>>
    Mysql学习总结(40)——MySql之Select用法汇总
    查看>>
    Mysql学习总结(41)——MySql数据库基本语句再体会
    查看>>
    Mysql学习总结(42)——MySql常用脚本大全
    查看>>
    Mysql学习总结(43)——MySQL主从复制详细配置
    查看>>
    Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
    查看>>
    Mysql学习总结(45)——Mysql视图和事务
    查看>>
    Mysql学习总结(46)——8种常被忽视的SQL错误用法
    查看>>
    Mysql学习总结(48)——MySql的日志与备份还原
    查看>>
    Mysql学习总结(49)——从开发规范、选型、拆分到减压
    查看>>
    Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
    查看>>
    Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
    查看>>
    Mysql学习总结(51)——Linux主机Mysql数据库自动备份
    查看>>
    Mysql学习总结(52)——最全面的MySQL 索引详解
    查看>>