博客
关于我
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共享锁与排他锁
    查看>>
    MySQL内存表使用技巧
    查看>>
    MySQL再叙(体系结构、存储引擎、索引、SQL执行过程)
    查看>>
    mysql出现错误的解决办法
    查看>>
    MySQL函数
    查看>>
    mysql函数汇总之数学函数
    查看>>
    mysql函数汇总之日期和时间函数
    查看>>
    mysql函数汇总之条件判断函数
    查看>>
    mysql函数汇总之系统信息函数
    查看>>
    MySQL函数简介
    查看>>
    mysql函数遍历json数组
    查看>>
    MySQL函数(转发)
    查看>>
    mysql分区表
    查看>>
    MySQL分层架构与运行机制详解
    查看>>
    mysql分库分表中间件简书_MySQL分库分表
    查看>>
    MySQL分库分表会带来哪些问题?分库分表问题
    查看>>
    MySQL分组函数
    查看>>
    MySQL分组查询
    查看>>
    Mysql分表后同结构不同名称表之间复制数据以及Update语句只更新日期加减不更改时间
    查看>>
    mySql分页Iimit优化
    查看>>