innodb存储引擎对mvcc的实现原理_最早支持的存储引擎

innodb存储引擎对mvcc的实现原理_最早支持的存储引擎一、InnoDB 体系架构 InnoDB 存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作: 维护所有进程/线程需要访问的多个内部数据结构。 缓存磁盘上的数据,方便快速的读取

InnoDB 存储引擎.

一、InnoDB 体系架构

innodb存储引擎对mvcc的实现原理_最早支持的存储引擎

InnoDB 存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责如下工作:

  • 维护所有进程/线程需要访问的多个内部数据结构。
  • 缓存磁盘上的数据,方便快速的读取,同时对磁盘文件的数据修改之前在这里进行缓存。
  • 重做日志(redo log)缓冲。

后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据。同时将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下 InnoDB 能恢复到正常运行状态。

通过 SHOW ENGINE INNODB STATUS 可以观察到 INNODB 存储引擎的运行情况。

SHOW ENGINE INNODB STATUS

代码100分

二、内存池

innodb存储引擎对mvcc的实现原理_最早支持的存储引擎
缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。缓冲池的大小直接影响着数据库的整体性能,可以通过配置参数 innodb_buffer_pool_size 来设置。

代码100分SHOW VARIABLES LIKE "innodb_buffer_pool_size"

并且 InnoDB 允许有多个缓存池实例,每个 PAGE 根据哈希值平均分配到不同缓冲池实例中,这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力,可以通过配置参数 innodb_buffer_pool_instances 来设置。

SHOW VARIABLES LIKE "innodb_buffer_pool_instances"

通常来说,数据库中的缓存池是通过 LRU(Lastest Recent Used,最近最少使用)算法来进行管理的,缓存池的默认单位是 “页”,一页默认 16 KB。

从 InnoDB 1.2 版本开始,可以通过 INNODB_BUFFER_POOL_STATS 来观察缓存池的运行状态。

代码100分SELECT 
 POOL_ID,
 HIT_RATE "缓存池的命中率",
 PAGES_MADE_YOUNG AS "缓存池 old 部分加入到 new 部分的次数", 
 PAGES_NOT_MADE_YOUNG "缓存池 new 部分加入到 old 部分的次数"
FROM information_schema.INNODB_BUFFER_POOL_STATS

重做日志缓存是用来存放重做日志信息的,一般不需要设置得过大,因为一般情况下每一秒钟都会将重做日志缓存刷新到日志文件,一般设置 8MB 就足以满足绝大部分得应用,可通过 INNODB_LOG_BUFFER_SIZE 参数控制。

SHOW VARIABLES LIKE "INNODB_LOG_BUFFER_SIZE"

当前事务数据库系统普遍都采用了 WriteAhead Log 策略,即当事务提交时,先写重做日志,再修改页。因此,重做日志的作用是对数据库系统中的数据进行恢复(当数据库系统异常宕机的时候)。

额外内存池是用来分配一些数据结构本身的内存,例如缓冲池中的帧缓存(frame buffer)、缓冲控制对象(innodb_buffer_pool)。

三、后台线程

Master Thread 是一个非常核心的后台线程,主要负责将缓存池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓存(INSERT BUFFER)、UNDO 页的回收等。

IO Thread 的工作主要是负责 IO 请求的回调处理(InnoDB 存储引擎中大量的使用了 AIO 来处理写 IO 请求)。

SHOW VARIABLES LIKE "INNODB_%io_threads"

PurgeThread 是在 InnoDB 1.1.x 版本中引入的。用来回收已经使用并分配的 undo 页以减轻 Master Thread 的工作量 ,因为事务被提交后,其所使用的 undolog 可能不再需要。

SHOW VARIABLES LIKE "INNODB_purge_threads"

Page Cleaner Thread 是在 InnoDB 1.2.x 版本中引入的。其作用是将之前版本的脏页刷新操作放入到单独的线程中来完成以减轻 Master Thread 的工作量。

四、其他

InnoDB 存储引擎开创性地设计了 Insert Buffer(插入缓冲),对于非聚簇索引的插入或更新操作,不是每一次直接插入到索引页中,而是先判断插入的非聚簇索引页是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个 Insert Buffer 对象中,然后再以一定的频率和情况进行 Insert Buffer 和辅助索引页子节点的 merge(合并)操作,这时通常能将多个插入合并到一个操作中(因为在一个索引页中),这就大大提高了对于非聚簇索引插入的性能。

doublewrite(两次写)由两部分组成,一部分是内存中的 doublewrite buffer,大小为 2MB,另一部分是物理磁盘上共享表空间中连续的 128个页,即2个区,大小同样是 2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是会通过 memcpy 函数将脏页先复制到内存中的 doublewrite buffer,之后通过 doublewrite buffer 再分两次,每次 1MB 顺序地写入共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免缓冲写带来的问题。如果操作系统在将页写入磁盘的过程中发生了崩溃,在恢复过程中,InnoDB 存储引擎可以从共享表空间中的 doublewrite 中找到该页的一个副本,将其复制到表空间文件,再应用重做日志。

SHOW GLOBAL STATUS LIKE "INNODB_dblwr%"

innodb存储引擎对mvcc的实现原理_最早支持的存储引擎

自适应哈希索引(Adaptive Hash Index,AHI)是指 InnoDB 存储引擎会自动根据访问的频率和模式来自动地为某些热点页建立哈希索引。AHI 是通过缓冲池的 B+ 树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。

在 InnoDB 存储引擎中,采用异步IO(Asynchronous IO,AIO)的方式来处理磁盘操作。

SHOW VARIABLES LIKE "innodb_use_native_aio"

InnoDB 存储引擎还提供了 Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区的所有页,如果是脏页,那么一起进行刷新,这样做的操作显而易见,通过 AIO 可以将多个 IO 写入操作合并为一个 IO 操作。(固态硬盘具有超高的 IOPS)

SHOW VARIABLES LIKE "innodb_flush_neighbors"

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7405.html

(0)
上一篇 2023-03-20
下一篇 2023-03-20

相关推荐

  • 10万字208道Java经典面试题总结(附答案)「终于解决」

    10万字208道Java经典面试题总结(附答案)「终于解决」1、JDK和JRE有什么区别?JDK(JavaDevelopmentKit),Java开发工具包JRE(JavaRuntimeEnvironment),Java运行环境JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。2、==和equals的区别是什么?对于基本类型,==比较的是值; 对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equa

    2023-03-02
    134
  • 5分钟搞定 PostgreSQL 到 Doris 数据迁移和同步

    5分钟搞定 PostgreSQL 到 Doris 数据迁移和同步简述 Apache Doris 是一个现代化的 MPP 分析型数据库产品,仅需 亚秒级 响应时间即可获得查询结果,能有效地支持实时数据分析。 本文主要介绍如何使用 CloudCanal 快速构建一条稳

    2023-06-13
    176
  • 用Python实现高效数据爬取

    用Python实现高效数据爬取互联网时代的到来让人们无时不刻不在接收和产生着海量的数据,如何实现高效数据的获取和信息提取已经成为了当今互联网行业最重要的工作之一。在这个过程中,数据爬取技术是至关重要的一环,Python作为一门较为常用的编程语言,有着很多优秀的爬虫框架和工具,使用Python编写代码能够有效地实现高效数据爬取。

    2024-04-21
    72
  • mysql备份数据导入_MySQL导出表

    mysql备份数据导入_MySQL导出表简介 mydumper 是一款开源的 MySQL 逻辑备份工具,主要由 C 语言编写。与 MySQL 自带的 mysqldump 类似,但是 mydumper 更快更高效。 mydumper 的一些优

    2023-05-13
    152
  • Redis基本操作进阶篇-[亲测有效]

    Redis基本操作进阶篇-[亲测有效]Redis中的事务(transaction)是一组命令的集合。一个事务中的命令要么全部执行,要么都不执行。Redis的事务没有关系数据库事务提供的回滚(rollback)功能。

    2023-05-03
    153
  • 如何正确发音Scrapy

    如何正确发音ScrapyScrapy是一个功能强大的Python网络爬虫框架,可用于从静态和动态网站上提取结构化数据。

    2024-05-05
    65
  • oracle锁表和解锁_数据库锁表会自动解锁吗

    oracle锁表和解锁_数据库锁表会自动解锁吗–ORACLE表被锁原因:具体操作某一个FORM界面,或者后台数据库操作某一个表时发现一直出于"假死"状态, –可能是该表被某一用户锁定,导致其他用户无法继续操作 –查询被锁

    2023-03-01
    158
  • Redis笔记总结(狂神说)[通俗易懂]

    Redis笔记总结(狂神说)[通俗易懂]Redis最新超详细版教程通俗易懂 一、Nosql概述 为什么使用Nosql 1、单机Mysql时代 90年代,一个网站的访问量一般不会太大,单个数据库完全够用。随着用户增多,网站出现以下问题 数据量

    2023-05-10
    152

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注