深入理解MySQL中MVCC与BufferPool缓存机制

目录
  • 一、MVCC机制
    • undo日志版本链与read-view机制
    • 版本链比对规则
  • 二、BufferPool机制
  • 三、总结

一、MVCC机制

  • MVCC(Multi Version Concurrency Control),MySQL(默认)RR隔离级别就是通过该机制来保证的,对一行数据的读与写两个操作默认是不会通过加锁互斥来保证隔离性的
  • 串行化隔离级别是为了保证较高的隔离性,是通过将所有操作加锁互斥来实现的
  • MySQL在RC隔离级别和RR隔离级别下都实现了MVCC机制
  • RC每次查询都会创建一个reade-view,而RR在创建完read-view之后,在不提交事务之前,每次查询还是第一次创建的read-view

undo日志版本链与read-view机制

  • undo日志版本链是指一行数据被多个事务一次修改后,当每个事务修改完之后,MySQL会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把只写undo日志串联起来形成一个历史记录版本链.
  • RR隔离级别,当事务开启,执行任何SQL时会生成当前事务的read-view一致性视图,该视图在事务结束之前都不会变化(如果是RC隔离界别在每次执行查询SQL时都会重新生成最新的read-view),这个视图由执行查询时所有未提交的事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里任何SQL查询结果需要从对应版本链里的最新数据开始逐条跟read-view作比对,从而得到最终的结果

版本链比对规则

  • 如果row的trx_id落在绿色部分(trx < min_id),表示这个版本是已提交的事务生成的,这个数据是可见的
  • 如果row的trx_id落在红色部分(trx > max_id),表示这个版本是由将来启动的(未开始)事务生成的,是不可见的(若row的trx_id就是当前自己的事务是可见的)
  • 如果 row 的 trx_id 落在黄色部分(min_id <= trx_id <= max_id),那就包括两种情况
    • 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的不可见(若 row 的 trx_id 就是当前自己的事务是可见的)
    • 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的可见

二、BufferPool机制

InnoDB执行的BufferPool缓存机制:

InnoDB的SQL执行流程:

  • 当客户端执行一条修改的SQL,需要经过Server层,再调用具体的执行引擎
  • 加载数据页,把需要修改数据所在的数据页,缓存到BufferPool
  • 修改前写undo日志,记录更改前数据,如果事务执行失败,使用undo日志进行数据回滚
  • 更新BufferPool中的数据
  • 准备提交事务写redo日志,保存操作记录。redo日志用来恢复已提交事务的BufferPool
  • 准备提交事务写binlog日志,保存操作记录。binlog日志用来恢复磁盘数据
  • 事务提交完成,此时binlog日志写入成功,并且在redo日志中记录了commit标记。事务提交完成后binlog日志和redo日志数据保持一致
  • 数据持久化,IO线程不定期把BufferPool中的数据随机写入到磁盘,完成持久化

三、总结

MVCC实现机制(为什么同一个事务第一次查询出来之后,就算其它事务把新数据修改了,当前事务还是看到之前的数据)

  • 它内部实际有个undo日志版本链,然后在事务第一次查询的时候,它会生成一个read-view一致性视图,然后我们后面所有查询的数据都会根据我们的那个undo日志版本链去跟我们当前的read-view里面按照一定的规则逐行去比对查找对应的数据

BufferPool机制

  • 数据库的增删改查都是直接操作BufferPool的,当我们执行一条修改的SQL经历过Server层之后会调用具体的执行引擎,然后将相关的数据页加载到BufferPool中,修改前写undo日志,记录修改前的数据为了方便事务失败之后的回滚,然后更新BufferPool,准备提交事务写redo日志保存操作记录,因为如果MySQL宕机了会从redo日志中将数据恢复到BufferPool中,然后会写binlog日志,保存操作记录,因为当我们删除数据库跑路时,binlog是用来恢复磁盘数据的,事务提交完成后,binlog日志写入成功,并且在redo日志记录提交标记,此时redo日志和binlog日志数据一致,而redo日志采用顺序IO写入,这样效率堪比内存操作。对于数据持久化,InnoDB会有个后台线程定时去将缓存刷到磁盘里

为什么MySQL不能直接更新磁盘上的数据而是设置了这么一套复杂的机制来执行SQL

  • 因为来一个请求直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差.
  • 因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件时不能让数据库抗住高并发的
  • MySQL这套机制看起来很复杂,但它可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性
  • 更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件,正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几千甚至上完的读写请求

到此这篇关于深入理解MySQL中MVCC与BufferPool缓存机制的文章就介绍到这了,更多相关MVCC与BufferPool缓存机制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MYSQL事务的隔离级别与MVCC

    目录 前言 1. 事务(transaction)的起源 1.1. 事务的定义 1.2. 哪些存储引擎支持事务 2. MySQL的事务语法 2.1. 自动提交 2.2. 手动操作事务 2.2.1. 开启事务 2.2.2. 提交或回滚 2.3. autocommit系统变量 3. 事务并发执行导致的读问题 3.1. 脏读 3.2. 不可重复读 3.3. 幻读 4. 回答一些可能存在的问题 5. SQL标准与4种隔离级别 5.1. 为什么要设置隔离级别? 5.2. 蹩脚的中文翻译 5.3. 为什么单单

  • MySQL多版本并发控制MVCC底层原理解析

    目录 1 事务并发中遇到的问题 1.1 脏读 1.2 不可重复读 1.3 幻读 2 隔离级别 3 版本链 4 ReadView 4.1 ReadView 定义 4.2 访问控制 4.3 再谈隔离 4.3.1 READ COMMITTED(读已提交) 4.3.2 REPEATABLE READ(可重读) 5 幻读 6 总结 1 事务并发中遇到的问题 1.1 脏读 当一个事务读取到了另外一个事务修改但未提交的数据,被称为脏读. 1.2 不可重复读 当事务内相同的记录被检索两次,且两次得到的结果不同时

  • MySQL多版本并发控制MVCC深入学习

    MVCC MVCC(Multi-Version Concurrency Control),即多版本并发控制.是 innodb 实现事务并发与回滚的重要功能.锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销. 具体实现是在数据库的每一行中,额外添加三个字段: DB_TRX_ID : 记录插入或更新该行的最后一个事务的事务ID DB_ROLL_PTR : 指向改行对应undolog 的指针 DB_ROW_ID : 单调递增的ID,他就

  • MySQL的多版本并发控制MVCC的实现

    目录 什么是MVCC MVCC的实现 MVCC 有没有解决幻读? 什么是MVCC MVCC就是多版本并发控制. MySQL的事务型存储引擎通过多版本并发控制(MVCC)来提升并发性能. 可以认为MVCC是行级锁的一个变种,但是它在大多数情况下避免了加锁操作,同时实现非阻塞的读操作,因此开销更低. MVCC是通过保存数据在某个时间点的快照来实现的,核心思想就是保存数据的历史版本,通过对数据行的多个版本管理来实现数据库的并发控制. 这样我们就可以通过比较版本号决定数据是否显示出来,读取数据的时候不需

  • mysql select缓存机制使用详解

    mysql Query Cache 默认为打开.从某种程度可以提高查询的效果,但是未必是最优的解决方案,如果有的大量的修改和查询时,由于修改造成的cache失效,会给服务器造成很大的开销,可以通过query_cache_type[0(OFF)1(ON)2(DEMAND)]来控制缓存的开关. 需要注意的是mysql query cache 是对大小写敏感的,因为Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以 任何sql语句的改变

  • MySQL的查询缓存机制基本学习教程

    MySQL缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的sql,服务器直接从缓存中取到结果,而不需要再去解析和执行sql.如果表更改 了,那么使用这个表的所有缓冲查询将不再有效,查询缓存值的相关条目被清空.更改指的是表中任何数据或是结构的改变,包括INSERT.UPDATE. DELETE.TRUNCATE.ALTER TABLE.DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表的使用MERGE表的查询.显然,这对于频繁更新的表,查询缓存是不适合的,而

  • 深入理解MySQL中MVCC与BufferPool缓存机制

    目录 一.MVCC机制 undo日志版本链与read-view机制 版本链比对规则 二.BufferPool机制 三.总结 一.MVCC机制 MVCC(Multi Version Concurrency Control),MySQL(默认)RR隔离级别就是通过该机制来保证的,对一行数据的读与写两个操作默认是不会通过加锁互斥来保证隔离性的 串行化隔离级别是为了保证较高的隔离性,是通过将所有操作加锁互斥来实现的 MySQL在RC隔离级别和RR隔离级别下都实现了MVCC机制 RC每次查询都会创建一个r

  • Mysql中mvcc各场景理解应用

    目录 前言 场景一 试验步骤 事务A第一步 事务B执行 事务A执行第二步 结果 场景二 试验步骤 事务A第一步 事务B执行 事务A执行第二步 结果 事务A后续步骤 场景三 场景四 事务A第一步 事务B执行 事务A第二步 事务A第三步 事务A第四步 原因 总结 前言 mysql版本为 mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.27 | +-----------+ 1 row in set (0.

  • MySQL中MVCC机制的实现原理

    目录 前言 什么是当前读和快照读? MVCC的实现原理 前言 MVCC全称为Multi Version Concurrency Control,直译为多版本并发控制,是MySQL中一种并发控制的方法,他主要是为了提高数据库的读写性能,用更好的方式去处理读写冲突. 什么是当前读和快照读? 在讲述MVCC机制实现原理之前,我们先了解一下当前读和快照读 当前读: 其实也很容易理解,当前读指的就是读取的是最新的记录,读取的时候还需要保证其他事务不能修改当前记录,所以会对读取的记录进行加锁处理 例如:se

  • 深入理解Mysql事务隔离级别与锁机制问题

    概述 数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能导致脏读.脏写.不可重复度和幻读.这些问题的本质都是数据库的多事务并发问题,为了解决事务并发问题,数据库设计了事务隔离机制.锁机制.MVCC多版本并发控制隔离机制,用一整套机制来解决多事务并发问题. 事务及其ACID属性 原子性:操作的不可分割: 一致性:数据的一致性: 隔离性:事务之间互不干扰: 持久性:数据的修改时永久的: 并发事务处理带来的问题 脏写:丢失更新,最后的更新覆盖了由其他事务所做的更

  • Android中图片的三级缓存机制

    我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制. 原理: 首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存缓存中,缓存到强引用中 也就是LruCache中.如果强引用中空间不足,就会将较早存储的图片对象驱逐到软引用(softReference)中存储,然后将图片缓存到文件(内部存储外部存储)中:读取图片的时候,先读取内存缓存,判断强引用中是否存在图片,如果强引用中存在,则直接读取,如果强引用中不存在,则

  • 一文带你理解MySql中explain结果filtered

    MySql explain语句的返回结果中,filtered字段要怎么理解? MySql5.7官方文档中描述如下: The filtered column indicates an estimated percentage of table rows filtered by the table condition. The maximum value is 100, which means no filtering of rows occurred. Values decreasing from

  • 深入理解MySQL中的事务机制

    使用数据库事务可以确保除事务性单元内的所有操作都成功完成.MySQL中的InnoDB引擎的表才支持transaction.在一个事务里,如果出现一个数据库操作失败了,事务内的所有操作将被回滚,数据库将会回到事务前的初始状态.有一些不能被回滚的语句:将在本文的最后讨论. 在一个web应用中,会很经常遇到需要使用事务的地方,要么希望若干语句都执行成功,要么都不执行,如果出现有些执行成功,而其他的失败将会导致数据损坏. 在这篇文章的例子中,我们使用下面的两张表"employee"和"

  • 深入理解Java中的HashMap的实现机制

    如果任何人让我描述一下HashMap的工作机制的话,我就简单的回答:"基于Hash的规则".这句话非常简单,但是要理解这句话之前,首先我们得了解什么是哈希,不是么? 什么是哈希 哈希简单的说就是对变量/对象的属性应用某种算法后得到的一个唯一的串,用这个串来确定变量/对象的唯一性.一个正确的哈希函数必须遵守这个准则. 当哈希函数应用在相同的对象或者equal的对象的时候,每次执行都应该返回相同的值.换句话说,两个相等的对象应该有相同的hashcode. 注:所有Java对象都从Objec

  • 正确理解Mysql中的列索引和多列索引

    Mysql数据库提供两种类型的索引,如果没正确设置,索引的利用效率会大打折扣却完全不知问题出在这. 复制代码 代码如下: CREATE TABLE test (    id         INT NOT NULL,    last_name  CHAR(30) NOT NULL,    first_name CHAR(30) NOT NULL,    PRIMARY KEY (id),    INDEX name (last_name,first_name)); 以上创建的其实是一个多列索引,

  • 快速理解MySQL中主键与外键的实例教程

    主键与外键的关系,通俗点儿讲,我现在有一个论坛,有两张表,一张是主贴 thread,一张是回帖 reply 先说说主键,主键是表里面唯一识别记录的字段,一般是帖子id,体现在访问的时候,例如是 thread.php?id=1   表示我要访问的是帖子id是1 的帖子- 再来说说外键,当我们删除某个帖子的时候,需要执行另一个操作,就是删除所有回帖,如果正常情况下,我们需要执行两次delete操作(thread和 reply),这时候如果存在外键,例如,在reply 表里面建立一个指向thread表

随机推荐