博客
关于我
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中varchar类型数字排序不对踩坑记录
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    mysql中的 +号 和 CONCAT(str1,str2,...)
    查看>>
    MySql中的concat()相关函数
    查看>>
    mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
    查看>>
    MySQL中的count函数
    查看>>
    MySQL中的DB、DBMS、SQL
    查看>>
    MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
    查看>>
    MySQL中的GROUP_CONCAT()函数详解与实战应用
    查看>>
    MySQL中的IO问题分析与优化
    查看>>
    MySQL中的ON DUPLICATE KEY UPDATE详解与应用
    查看>>
    mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
    查看>>
    mysql中的undo log、redo log 、binlog大致概要
    查看>>
    Mysql中的using
    查看>>
    MySQL中的关键字深入比较:UNION vs UNION ALL
    查看>>
    MYSQL中频繁的乱码问题终极解决
    查看>>