博客
关于我
MySQL底层概述—1.InnoDB内存结构
阅读量:795 次
发布时间:2023-02-12

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

InnoDB 引擎架构深入解析

InnoDB 是 MySQL 早期版本的默认存储引擎,因其支持事务处理和并发控制而被广泛采用。本文将从缓存机制、页面管理、日志记录等方面深入探讨 InnoDB 引擎的核心架构。

1. InnoDB 引擎架构概述

InnoDB 引擎主要由内存结构和磁盘结构两部分组成。其内存结构负责缓存数据和索引以减少磁盘 IO 开销,而磁盘结构则存储实际的数据和索引文件。

1.1 InnoDB 内存结构

InnoDB 内存结构包括两个主要部分:缓存池(Buffer Pool)和控制块。缓存池用于存储数据页和索引页,而控制块则记录缓存页的相关信息,包括表空间 ID、页号等。

1.2 Buffer Pool 概念

Buffer Pool 是 InnoDB 的核心缓存机制,主要用于缓存表数据和索引数据。缓存池默认大小为 128MB,每个数据页大小为 16KB,控制块占用约 5% 的空间。

1.3 Page 类型与管理

InnoDB 的页面管理分为三种状态:空闲页(Free Page)、干净页(Clean Page)和脏页(Dirty Page)。空闲页用于缓存未使用的数据,干净页为已加载但未修改的数据,脏页则为已修改但尚未写入磁盘的数据。

2. Buffer Pool 管理

2.1 Buffer Pool 基本概念

Buffer Pool 作为内存缓存池,通过控制块记录缓存页的相关信息,有效地减少了磁盘 IO 操作。

2.2 数据页缓存判断

InnoDB 使用哈希表判断数据页是否已缓存在 Buffer Pool 中。哈希表的键为表空间 ID 和页号,值为对应的控制块。

3. Page 管理机制

3.1 Page 类型划分
  • 空闲页 (Free Page):未被使用的缓存页,占用内存但未加载数据。

  • 干净页 (Clean Page):已加载数据且未修改的缓存页。

  • 脏页 (Dirty Page):已加载数据并进行了修改,但尚未写入磁盘的缓存页。

3.2 Page 管理链表

InnoDB 使用三种链表管理 Page:

  • Free List:管理空闲缓存页,用于加载新数据。
  • Flush List:管理需要刷盘的脏页,按修改时间排序。
  • LRU List:管理当前使用的缓存页,基于最近使用时间优先淘汰旧数据。
  • 4. Change Buffer 机制

    Change Buffer 用于优化对二级索引页的更新操作,主要用于减少磁盘 IO 开销。

    4.1 Change Buffer 基本概念

    Change Buffer 是写缓冲区,用于缓存对二级索引页的更新操作,最大可占 Buffer Pool 的 50%。

    4.2 数据更新流程
    • 对于普通索引页,若数据未命中缓存池,则将更新记录到 Change Buffer 中,待数据被读取时批量合并到缓存池。

    • 对于唯一索引,需直接加载数据页进行修改,不涉及 Change Buffer。

    4.3 Change Buffer 操作场景

    适用于写多读少的业务场景,如账单系统等,Change Buffer 能显著减少磁盘 IO 操作。

    5. Log Buffer 机制

    Log Buffer 用于记录 InnoDB 的日志数据,主要用于事务恢复和 crash-safe 操作。

    5.1 Log Buffer 操作流程
    • Log Buffer 内容定期刷新到磁盘,默认大小为 16MB。

    • 可通过参数 innodb_log_buffer_size 调整日志缓冲区大小,减少磁盘 IO 操作。

    5.2 事务提交与日志刷盘
    • flush_log_at_trx_commit=1:在事务提交时立即刷盘,数据安全性高,但 IO 操作频繁。

    • flush_log_at_trx_commit=0:在事务提交时刷盘每隔 1 秒执行,可能丢失最多 1 秒数据。

    6. 自适应哈希索引

    InnoDB 利用自适应哈希索引优化查询性能,通过监控索引访问频率动态决定是否建立哈希索引。

    总结

    InnoDB 引擎通过缓存机制、页面管理和日志记录等核心机制,显著提升了数据库性能。Buffer Pool、Change Buffer 和 Log Buffer 等组件分别负责数据缓存、增删改查优化和事务安全,构成了 InnoDB 引擎高效运行的基础。

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

    你可能感兴趣的文章
    Mysql学习总结(14)——Mysql主从复制配置
    查看>>
    Mysql学习总结(15)——Mysql错误码大全
    查看>>
    Mysql学习总结(16)——Mysql之数据库设计规范
    查看>>
    Mysql学习总结(17)——MySQL数据库表设计优化
    查看>>
    Mysql学习总结(18)——Mysql主从架构的复制原理及配置详解
    查看>>
    Mysql学习总结(19)——Mysql无法创建外键的原因
    查看>>
    Mysql学习总结(19)——Mysql无法创建外键的原因
    查看>>
    Mysql学习总结(1)——常用sql语句汇总
    查看>>
    Mysql学习总结(20)——MySQL数据库优化的最佳实践
    查看>>
    Mysql学习总结(21)——MySQL数据库常见面试题
    查看>>
    Mysql学习总结(22)——Mysql数据库中制作千万级测试表
    查看>>
    Mysql学习总结(23)——MySQL统计函数和分组查询
    查看>>
    Mysql学习总结(24)——MySQL多表查询合并结果和内连接查询
    查看>>
    Mysql学习总结(25)——MySQL外连接查询
    查看>>
    Mysql学习总结(26)——MySQL子查询
    查看>>
    Mysql学习总结(27)——Mysql数据库字符串函数
    查看>>
    Mysql学习总结(28)——MySQL建表规范与常见问题
    查看>>
    Mysql学习总结(29)——MySQL中CHAR和VARCHAR
    查看>>
    Mysql学习总结(2)——Mysql超详细Window安装教程
    查看>>
    Mysql学习总结(30)——MySQL 索引详解大全
    查看>>