[黑马程序员]进阶篇-InnoDB引擎

InnoDB引擎

逻辑存储结构

  • [黑马程序员]进阶篇-InnoDB引擎_第1张图片
  • 表空间:xxx.ibd

    • 数据段
    • 索引段
    • 回滚段
    • InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的非叶子节点。段用来管理多个Extent(区)
    • 表空间的单元结构,每个区的大小为1M
    • 默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页
    • InnoDB 存储引擎磁盘管理的最小单元
    • 每个页的大小默认为 16KB
    • InnoDB 存储引擎每次从磁盘申请 4-5 个区
    • InnoDB 存储引擎数据是按行进行存放的
    • 默认有两个隐藏字段
      • Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列
      • Roll_pointer: 把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息

架构

概述

  • InnoDB架构图
    • [黑马程序员]进阶篇-InnoDB引擎_第2张图片
  • 内存结构
    • [黑马程序员]进阶篇-InnoDB引擎_第3张图片
    • Buffer Pool

      • 为了尽可能弥补这两者之间的I/O效率的差值,就需要把经常使用的数据加载缓冲池中,避免每次访问都进行磁盘I/O。
      • InnoDB的缓冲池中不仅缓存了索引页和数据页,还包含了undo页、插入缓存、适应哈希索引以及InnoDB的锁信息等等
      • 主内存中的一个区域
      • 里面可以缓存磁盘上经常操作的真实数据
      • 在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存)
      • 再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
      • 缓冲池以Page页为单位,底层采用链表数据结构管理Page
        • free page:空闲page,未被使用
        • clean page:被使用page,数据没有被修改过
        • dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致
      • 专用服务器上,通常将多达80%的物理内存分配给缓冲池
        show variables like 'innodb_buffer_pool_size';
        
    • Change Buffer

      • 更改缓冲区(针对于非唯一二级索引页),在执行DML语句时
      • 如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘
      • 会将数据变更存在更改缓冲区 Change Buffer中,
      • 在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中
      • 原因:
        • 二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引
        • 删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO
        • 有了ChangeBuffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO
    • Adaptive Hash Index

      • 用于优化对Buffer Pool数据的查询
      • 是hash索引又不适合做范围查询、模糊匹配
      • InnoDB存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下hash索引可以提升速度,则建立hash索引,称之为自适应hash索引
      • 自适应哈希索引,无需人工干预,是系统根据情况自动完成
    • Log Buffer

      • 日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log,undo log)
      • 默认大小为 16MB,日志缓冲区的日志会定期刷新到磁盘中
      • 如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O
      • innodb_log_buffer_size:缓冲区大小
      • innodb_flush_log_at_trx_commit
        • 1: 日志在每次事务提交时写入并刷新到磁盘,默认值
        • 0: 每秒将日志写入并刷新到磁盘一次
        • 2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次

磁盘结构

  • 图解

    • [黑马程序员]进阶篇-InnoDB引擎_第4张图片
  • System Tablespace

    • 系统表空间,默认的文件名叫 ibdata1
  • File-Per-Table Tablespaces

    • 如果开启了innodb_file_per_table开关,则每个表的文件表空间包含单个InnoDB表的数据和索引 ,并存储在文件系统上的单个数据文件中。
    • innodb_file_per_table ,该参数默认开启
  • General Tablespaces

    • 通用表空间,需要通过 CREATE TABLESPACE语法创建通用表空间,在创建表时,可以指定该表空间
  • Undo Tablespaces

    • 撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志
  • Temporary Tablespaces

    • InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据
  • Doublewrite Buffer Files

    • 双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件
      中,便于系统异常时恢复数据
  • Redo Log

    • 重做日志,是用来实现事务的持久
    • 该日志文件由两部分组成
      • 重做日志缓冲
      • 重做日志文件
      • 前者是在内存中,后者在磁盘中
  • 后台线程

    • [黑马程序员]进阶篇-InnoDB引擎_第5张图片
    • Master Thread
      • 核心后台线程,负责调度其他线程
      • 还负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性
      • 还包括脏页的刷新、合并插入缓存、undo页的回收
    • IO Thread
      • [黑马程序员]进阶篇-InnoDB引擎_第6张图片
      • 命令
      show engine innodb status \G;
      
    • Purge Thread
      • 主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收
    • Page Cleaner Thread
      • 协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞

你可能感兴趣的:(mysql,mysql,sql,数据库)