高性能 MySQL(四):多版本并发控制(MVCC)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MVCC(Multiversion Concurrency Control)即多版本并发控制,它是数据库系统常用的一种并发控制,用于提升事务内数据的并发性。可以认为 MVCC 是行锁的一个变种,在很多种情况下避免了加锁操作,因此开销更低。MVCC 的实现,是通过保存数据在某个时间点的**快照**来实现的。也就是说,每个事务读到的数据都是一个历史快照,不管这个事务执行多长时间,事务内看到的数据总是一致的。

大家好,我是水滴~~

在上一篇《高性能 MySQL(三):事务与锁详解》中,我们讲到了事务有四个标准的隔离级别,在可重复读级别中有一个幻读问题,InnoDB 是通过 MVCC 解决该问题的。

本篇就来介绍一下 MVCC 到底是什么,以及它如何解决幻读的。

1 什么是 MVCC

MVCC(Multiversion Concurrency Control)即多版本并发控制,它是数据库系统常用的一种并发控制,用于提升事务内数据的并发性。可以认为 MVCC 是行锁的一个变种,在很多种情况下避免了加锁操作,因此开销更低。

MVCC 的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,每个事务读到的数据都是一个历史快照,不管这个事务执行多长时间,事务内看到的数据总是一致的。

2 InnoDB 中的 MVCC

大多数的数据库系统已经使用了 MVCC ,包括 MySQL、Oracle、PostgreSQL、HBase等等。MVCC 没有一个统一的实现标准,所以各自实现的机制不尽相同。下面我们通过 InnoDB 的简化版行为来说明 MVCC 是如何工作的。

InnoDB 实现的 MVCC,是通过在每行记录后面保存两个隐藏列来实现的。这两列,一个存储创建时的版本号,另一个存储删除时的版本号(可能为空)。这里的版本号,指的是系统版本号(System Version Number)。InnoDB 会维护一个自增的系统版本号,每开始一个新的事务时,系统版本号都会自动递增,事务开始时的系统版本号会做为事务版本号

下面特准使用一个示例,看下 MVCC 在可重复读隔离级别下是如何操作的。其中创建时的版本号使用create_version字段表示,删除时的版本号使用delete_version字段表示。

3c4abdb5ff25da440377c046a0a28503_MVCC%20(7)_auth_key=1686635936-aRmBsNY57zUVWHQxyfM29p-0-582530d3a8c3caae240b09c154f1d5e4&file_size=10024.jpg

2.1 插入(INSERT)

为新插入的每一行保存当前事务版本号,作为行版本号(即创建时版本号)。

示例插入两条记录:

insert into `user` (id, name, balance) values (1, '刘一', 50), (2, '陈二', 100);

假设当前事务版本号为1,那么插入后的数据行如下:

23997a38570bd7bf2f9fccadc2702d8a_MVCC_INSERT%20(1)_auth_key=1686635959-m4TtPUWNDKiQQ6Qsb9vDLA-0-37bbb3f7b7620fa475b39ec3918b22af&file_size=10682.jpg

2.2 修改(UPDATE)

更新时并不会删除旧的行,而是将旧行的删除版本号标记为当前事务版本号,再插入一行新的记录。

示例修改一条记录:

update `user` set balance = 60 where id = 1;

假设当前事务版本号为2,那么修改后的数据行如下:

354d70df25bb98febc0e2cf4f7f6c470_MVCC_UPDATE%20(2)_auth_key=1686636022-52a7WHJvqUX4yavx3B9XNo-0-e9e24d4cb2f6279ad214ff5526ff43d4&file_size=13486.jpg

2.3 删除(DELETE)

删除时,会将当前事务版本号作为删除版本号。

示例删除一条记录:

delete from `user` where id = 1;

假设当前事务版本号为3,那么删除后的数据行如下:

f9cf3fb65d16e0b0bb660eb4b2285449_MVCC_DELETE_auth_key=1686636041-w2RpzdJeZVNt8SfZvBxDse-0-aacb0a60701353fca2e9698ec2ab8e5c&file_size=13681.jpg

2.4 查询(SELECT)

查询时,有两个必要条件:

  1. 只查找,行的创建版本号小于或等于当前事务版本号的记录。这样可以确保事务读取的行,要么是事务开始前已经存在,要么是事务自身插入或修改过的。
  2. 并且,行的删除版本号要么未定义,要么大于当前事务版本号。这可以确保事务读取的行,在事务开始之前未被删除。

以上两个条件同时符合的记录,才会被查出。这也是 MVCC 不会出现幻行的原因。

3 总结

使用这两个隐藏列,使大多数读操作都可以不用加锁,可以认为它是乐观锁的一种实现。使用这样的设计能够提高性能,并能解决幻行问题。不足之处是,每行记录都需要额外的存储空间,并且需要做更多的行检查工作,以及一些额外的维护工作。

当然这只是一个简化版的说明,真实的 MVCC 会更加复杂一些,感兴趣的老铁可以看下官网介绍:InnoDB Multi-Versioning。博主打算后面再开一个专栏,用于探索 MySQL 官网文档,毕竟那里才是最准确的一手资料!

6270191d2ea47a8a9327c75ab6db55eb_%E4%B8%89%E8%BF%9E_auth_key=1686636053-ehibSUCECGZFNSeLpJA6zV-0-0136d3ab1cb760abf58cfef994bd22b1&file_size=313722.jpg

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
27天前
|
存储 关系型数据库 MySQL
MySQL MVCC全面解读:掌握并发控制的核心机制
【10月更文挑战第15天】 在数据库管理系统中,MySQL的InnoDB存储引擎采用了一种称为MVCC(Multi-Version Concurrency Control,多版本并发控制)的技术来处理事务的并发访问。MVCC不仅提高了数据库的并发性能,还保证了事务的隔离性。本文将深入探讨MySQL中的MVCC机制,为你在面试中遇到的相关问题提供全面的解答。
88 2
|
1月前
|
缓存 关系型数据库 MySQL
MySQL并发支撑底层Buffer Pool机制详解
【10月更文挑战第18天】在数据库系统中,磁盘IO操作是性能瓶颈之一。为了提高数据访问速度,减少磁盘IO,MySQL引入了缓存机制。其中,Buffer Pool是InnoDB存储引擎中用于缓存磁盘上的数据页和索引页的内存区域。通过缓存频繁访问的数据和索引,Buffer Pool能够显著提高数据库的读写性能。
89 2
|
20天前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
46 5
|
27天前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
88 3
|
25天前
|
关系型数据库 MySQL
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
mysql 5.7.x版本查看某张表、库的大小 思路方案说明
28 1
|
1月前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
68 1
|
25天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
36 0
|
1月前
|
监控 关系型数据库 MySQL
MySQL并发控制与管理
【10月更文挑战第17天】MySQL并发控制与管理
24 0
|
1月前
|
存储 监控 关系型数据库
MySQL并发控制与管理:优化数据库性能的关键
【10月更文挑战第17天】MySQL并发控制与管理:优化数据库性能的关键
156 0
|
14天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
下一篇
无影云桌面