MySQL InnoDB MVCC 原理及其纠正

MySQL核心技术原理之:MySQL事务隔离级别与原理 作者:禅与计算机程序设计艺术 1.简介 随着互联网的飞速发展,网站的并发访问量越来越大,数据库的事务处理能力要求也越来越高。在这种情况下,如果应用服务器直接对数据库进行操作,可能会出现资源竞争、数据不一致等问题。为了解决这些问题,数据库系统中引入了事务隔离级别(Transaction Isolation 阅读详情

http://blog.sina.com.cn/s/blog_711b11fd0101bhks.html


一、基础知识

事务:

事务是一组原子性sql查询语句,被当作一个工作单元。若mysql对改事务单元内的所有sql语句都正常的执行完,则事务操作视为成功,所有的sql语句才对数据生效,若sql中任意不能执行或出错则事务操作失败,所有对数据的操作则无效(通过回滚恢复数据)。事务有四个属性:

1、原子性:事务被认为不可分的一个工作单元,要么全部正常执行,要么全部不执行。

2、一致性:事务操作对数据库总是从一种一致性的状态转换成另外一种一致性状态。

3、隔离性:一个事务的操作结果在内部一致,可见,而对除自己以外的事务是不可见的。

4、永久性:事务在未提交前数据一般情况下可以回滚恢复数据,一旦提交(commit)数据的改变则变成永久(当然用update肯定还能修改)。

ps:MYSAM 引擎的数据库不支持事务,所以事务最好不要对混合引擎(如INNODB 、MYISAM)操作,若能正常运行且是你想要的最好,否则事务中对非支持事务表的操作是不能回滚恢复的。

读锁:

也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

写锁:

又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。

行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。

MVCC:多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。

Autocommit:是mysql一个系统变量,默认情况下autocommit=1表示mysql把没一条sql语句自动的提交,而不用commit语句。所以,当要开启事务操作时,要把autocommit设为0,可以通过“set session autocommit=0; ”来设置


二、MVCC实现原理以及例化理解(包含些测试以便理解)


第一:先看看网络上几乎全部一样的理解,包括《高性能mysql第二版(中文版)》也如此说明,这样是很容易理解。

但笔者觉得2个地方不妥,先看内容,在后面笔者会给出不妥地方用(1、2…)加粗标志出来,且给出测试证明。


Ps:这些只是外部看来的理解层面,深层次在第三点讲解

------------------------------------------

InnoDB实现MVCC的方法是,它存储了每一行的两个(1)额外的隐藏字段,这两个隐藏字段分别记录了行的创建的时间和删除的时间。在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。依照事物的 版本来检查每行的版本号。在事物隔离级别为可重复读的情况下,来看看怎样应用它。

SELECT

Innodb检查没行数据,确保他们符合两个标准:

     1、InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行

     2、行的删除操作的版本一定是未定义的或者大于当前事务的版本号。确定了当前事务开始之前,行没有被删除(2)

  符合了以上两点则返回查询结果。

  INSERT

     InnoDB为每个新增行记录当前系统版本号作为创建ID。

  DELETE

     InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。

  UPDATE

InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

----------------------------------------------

(1)    不是两个,是三个。

1) DB_TRX_ID:一个6byte的标识,每处理一个事务,其值自动+1,上述说到的“创建时间”和“删除时间”记录的就是这个DB_TRX_ID的值,如insert、update、delete操作时,删除操作用1个bit表示。 DB_TRX_ID是最重要的一个,可以通过语句“show engine innodb status”来查找,如下:

   -----------------------------------------

   ……

      TRANSACTIONS

------------

Trx id counter 0 430621

Purge done for trx's n:o < 0 430136 undo n:o < 0 0

History list length 7

……

   ------------------------------------------

2) DB_ROLL_PTR: 大小是7byte,指向写到rollback segment(回滚段)的一条undo log记录(update操作的话,记录update前的ROW值)。


3) DB_ROW_ID: 大小是6byte,该值随新行插入单调增加,当由innodb自动产生聚集索引时,聚集索引包括这个DB_ROW_ID的值,不然的话聚集索引中不包括这个值. 这个用于索引当中。


(2)    这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在commit的时候。网上的说法很容易让读者误解。

(3)    这点上面没有标注,在insert操作时 “创建时间”=DB_ROW_ID,这时,“删除时间 ”是未定义的;在update时,复制新增行的“创建时间”=DB_ROW_ID,删除时间未定义,旧数据行“创建时间”不变,删除时间=该事务的DB_ROW_ID;delete操作,相应数据行的“创建时间”不变,删除时间=该事务的DB_ROW_ID;select操作对两者都不修改,只读相应的数据。


第二、下面用图形化形式表示MVCC如何处理select、insert、delete、update

有两个事务A、B

假设开始时间顺序ABCD,且DB_TRX_ID满足以下情况

A. DB_TRX_ID = 2010

B. DB_TRX_ID = 2011

C. DB_TRX_ID = 2012

D. DB_TRX_ID = 2013

注意:

1、B. DB_TRX_ID> A. DB_TRX_ID是因为DB_TRX_ID的值是系统版本号的值,系统版本号是自动增加的,所以DB_TRX_ID也是自动增加。但是会出现这种情况,假如A事务开始后B事务开始前有一个insert操作插入一行数据(没有bengin、comint),则B. DB_TRX_ID= A. DB_TRX_ID+1+1 ,并不符合不是说系统版本号增量为1,其实并不矛盾,其实每一条sql操作可以当作一个事务,因为autocommit=1,所以这个insert操作是一个事务,A事务之后新增2个事务, 所以是加2而不是1。

2、下面例化图只是笔者方便大家理解而设计的图片,红色框代表隐藏两列

例化1:SECLET

这是表test数据

trx代表改行数据是那个事务创建

creat_num是“创建时间”,也就是DB_TRX_ID值

dele_num是“删除时间 ”,空列代表没被任何事务标志为已“删除”,图中id为2的数据行的dele_num=2012表示事务C“删除”了改行。


 

B事务有select * from test;语句,按照MVCC原理,该语句相当于:select * from test where creat_num>=2011 and (dele_num=NULL OR dele_num>2011),所以返回数据是id为1、2行。

D事务select * from test;则返回出id为1、3、4的行。因为2行被C事务删除了。

例化2:UPDATE


 

A事务一条语句“update from test set col=’winben’ where col=’benwin’”。

则先复制一条数据如蓝色框,creat_num=DB_TRX_ID(这里是2010),dele_num=NULL,然后把旧行数据的设dele_num=2010,等commit后则删除旧数据行

例化3:DELET

删除就是设dele_num= DB_TRX_ID

-------于2012.12.23加上start----------------------------------------------------------------

和一位淘宝网友讨论一个问题(关于事务隔离级别,这里就直接贴不整理了)

网友: 请教个问题,innodb的事务,一定是按ID顺序提交么? ID为101的一定在ID为100的事务之后?

笔者:这个问题我也不确定。我认为不是按顺序的,可以这样想一下,加入a事务很大是id100,然后还没commit之前有id为101的事务b并发开始处理,但b事务很小处理完了,如果要等a事务的话则是一个鸡肋了。当然还有考虑锁的问题,如果a事务设置了排他锁,且b事务有写操作那不事务则在等待队列中了,那commit的顺序肯定是a然后b的!

网友:如果是这样的话,假设有100,101,102三个事务,101最先提交了,这时新事务103,应该能看到101的更改,而如果按当前活跃ID的最小的比较(这时为100),那就看不到101的更新。


笔者:结合事务隔离级别:

1、READ UNCOMMITTED ,不适用MVCC读,可以读到其他事务修改甚至未提交的

2、READ COMMITTED ,其他事务对数据库的修改,只要已经提交,其修改的结果就是可见的,与这两个事务开始的先后顺序无关,不完全适用于MVCC读,像你说的100的读101的是可以的(按照MVCC理论应该不行的),但适用102读101(能套MVCC理论)。

3、REPEATABLE READ,可重复读,完全适用MVCC,只能读取在它开始之前已经提交的事务对数据库的修改,在它开始以后,所有其他事务对数据库的修改对它来说均不可见

4、 SERIALIZABLE ,完全不适合适用MVCC,这样所有的query都会加锁,再它之后的事务都要等待

MVCC只工作在REPEATABLE READ和READ COMMITED隔离级别下

 

-------于2012.12.23加上start----------------------------------------------

三、深入MVCC实现机制

1、到这里很多人就会发现,如果确实根据creat_num 即时事务DB_TRX_ID去比较获取事务的话,按道理在一个事务B(比A后,但A还没commit)select的话B. DB_TRX_ID>A.DB_TRX_ID则应该能返回A事务对数据的操作以及修改。那不是和前面矛盾?其实不然,只是前面没有讲到以下内容。

InnoDB每个事务在开始的时候,会将当前系统中的活跃事务列表(trx_sys->trx_list)创建一个副本(read view),然后一致性读去比较记录的tx id的时候,并不是根据当前事务的tx id,而是根据read view最早一个事务的tx id(read view->up_limit_id)来做比较的,这样就能确保在事务B之前没有提交的所有事务的变更,B事务都是看不到的。当然,这里还有个小问题要处理一下,就是当前事务自身的变更还是需要看到的。


 

在storage/innobase/read/read0read.c中实现了创建read view的函数read_view_open_now,在storage/innobase/include/read0read.ic中实现了判断一致性读是否可见的read_view_sees_trx_id

代码:

  1. read_view_t*  
  2. read_view_open_now(  
  3.   
  4.          trx_id_t    cr_trx_id,            
  5.          mem_heap_t*          heap)                   
  6. {  
  7.          read_view_t*  view;  
  8.          trx_t*                trx;  
  9.          ulint          n;  
  10.          ut_ad(mutex_own(&kernel_mutex));  
  11.          view = read_view_create_low(UT_LIST_GET_LEN(trx_sys->trx_list), heap);  
  12.          view->creator_trx_id = cr_trx_id;  
  13.          view->type = VIEW_NORMAL;  
  14.          view->undo_no = 0;  
  15.            
  16.          view->low_limit_no = trx_sys->max_trx_id;  
  17.          view->low_limit_id = view->low_limit_no;  
  18.          n = 0;  
  19.          trx = UT_LIST_GET_FIRST(trx_sys->trx_list);  
  20.            
  21.          while (trx) {  
  22.                    if (trx->id != cr_trx_id  
  23.                        && (trx->conc_state == TRX_ACTIVE  
  24.                             || trx->conc_state == TRX_PREPARED)) {  
  25.                             read_view_set_nth_trx_id(view, n, trx->id);  
  26.                            n++;  
  27.                               
  28.                             if (view->low_limit_no > trx->no) {  
  29.                                      view->low_limit_no = trx->no;  
  30.                             }  
  31.                    }  
  32.                    trx = UT_LIST_GET_NEXT(trx_list, trx);  
  33.          }  
  34.          view->n_trx_ids = n;  
  35.          if (n > 0) {  
  36.                      
  37.                    view->up_limit_id = read_view_get_nth_trx_id(view, n - 1);  
  38.          } else {  
  39.                    view->up_limit_id = view->low_limit_id;  
  40.          }  
  41.          UT_LIST_ADD_FIRST(view_list, trx_sys->view_list, view);  
  42.          return(view);  
  43.   
  44. }  

 

2、MVCC如何控制update操作

前面说先复制新数据,并插入DB_TRX_ID的值,在把旧数据的删除标志DB_TRX_ID

现在先介绍几个概念:

DB_ROLL_PTR是指向回滚段中旧版本7byte回滚指针。

redo log:重做日志,就是每次mysql在执行写入数据前先把要写的信息保存在重写日志中,但出现断电,奔溃,重启等等导致数据不能正常写入期望数据时,服务器可以通过redo_log中的信息重新写入数据。

undo log:撤销日志,与redo log恰恰相反,当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态。

mvcc中update步骤:

1、 记录事务中修改行数据的相应字段和值(包括旧版本事务id)在undo-log中记录。

2、 修改相应数据。

3、 在redo-log中保存要修改的相应(新版本事务id)数据写入

以上骤详细代码内容可看:

http://hi.baidu.com/gao1738/blog/item/dcec39d6185af2049d163d8c.html

4、 假如update不能正常运行怎根据undo-log redo-log 来回复

5、 当然如果当前版本事务没有commit的话则通过undo-log信息恢复原始数据状态

YOLOv11改进策略【SPPF】| 将特征金字塔池化修改为:SPPCSPC,提升模型的特征提取能力和计算效率。 本文记录的是。YOLOv7中的SPPCSPC(Spatial Pyramid Pooling Cross Stage Partial Connections)模块是一种结合了(SPP)和(CSP)的改进结构,本文将其添加到YOLOv11中, 阅读详情

相关推荐

从透射谱到能量分布:用Rsoft破解光纤光栅耦合模式的3个关键技巧

本文面向光通信工程师与研究者,分享了利用Rsoft软件深入分析光纤光栅耦合模式的三个关键技巧。通过配置场监视器观察XY截面能量分布、利用传播动画追踪动态过程,并结合模式求解器精准判定相位匹配,帮助用户超越透射谱分析,直观可视化能量从纤芯到包层的耦合与流动,从而优化器件设计。

weixin_29290963的博客 420

【mysql】MVCC及实现原理

MVCC,全称 Multi-Version Concurrency Control ,即多版本并发控制。MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读(1)当前读像 select lock in share mode (共享锁), select for update;update;

weixin_44823875的博客 2124

幻尔串口总线舵机控制Python SDK

幻尔串口总线舵机控制Python SDK,可以直接在PC端,不需要借助单片机对舵机进行控制。

daishabby2486的博客 4079

InnoDB下的MVCC

MVCC,是采用乐观锁思想的一种方式; 在 MySQL 中,默认的隔离级别是可重复读,可以解决脏读和不可重复读的问题,但不能解决幻读问题。 如果想要解决幻读问题,就需要采用串行化的方式,也就是将隔离级别提升到最高,但这样一来就会大幅降低数据库的事务并发能力。 我们也可以采用MVCC+Next-Key Lock的方式来解决幻读问题。 MVCC 是什么 MVCC 的英文全称是 Multiversion Concurrency Control,即多版本并发控制技术。 MVCC 是通过数据行的多个版本管

shade7的博客 1782

国民技术N32G45X SysTick定时器实战:从1us到100ms的精准延迟实现(附完整代码)

本文详细解析了国民技术N32G45X芯片中SysTick定时器的工作原理,并提供了从1微秒到100毫秒的高精度延迟实现方案。通过对比官方库函数的局限性,文章重点介绍了无中断查询模式、时钟源选择策略以及完整的代码实现,帮助嵌入式开发者精准控制时序,适用于LED控制、软件模拟通信协议等多种实战场景。

weixin_29190573的博客 374

跨阻放大器(TIA)的输入输出阻抗的定义、分析和影响因素

跨阻放大器(Transimpedance Amplifier,简称TIA)是一种常用于将电流信号转换为电压信号的放大器。在TIA电路中,输入阻抗是指输入端对电流信号的响应能力,输出阻抗是指输出端对负载电阻的驱动能力。本文将分别介绍TIA的输入和输出阻抗的定义、分析以及影响因素。

weixin_44378594的博客 1万+

【MYSQL】InnoDB的MVCC详解

readView = {m_ids=[40,60],min_trx_id=40,max_trx_id=61,creator_trx_id=40},这个时候去读数据发现第一条数据trx_id = 60,不等于creator_trx_id,说明并不是自己修改的,并且trx_id 大于min_trx_id,小于max_trx_id,说明此数据在事务A处理的范围内,并且在活跃事务表当中有trx_id = 60,说明此时该事务并未提交,根据RC隔离级别的要求,此时第一条数据不可见。

m0_63011748的博客 1465

Proteus仿真——电压比较器

电压比较器是一种对输入信号进行鉴别与比较的电路,是组成非正弦波发生电路的基本单元电路。常用电压比较器有如下几种:单限比较器、滞回比较器、窗口比较器、集成电压比较器等。

weixin_58745307的博客 3375

【MySQL】MVCC及其实现原理

MVCC介绍以及其实现原理详解,RC和RR隔离级别下MVCC的差异、MVCC+Next-key-Lock 防止幻读

关关的博客 2314

【数据同化第二期】数据同化中三大理论基础之一(最小方差估计)

【数据同化第二期】深入理解数据同化及经典案例(最小方差估计)

WW、forever的博客 1596

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

【数据集处理】基于ERA5 气温/湿度数据计算湿球温度并判别湿热浪

WW、forever的博客 487

MySQL事务隔离级别的实现原理MVCC

MVCC(Multi-Version Concurrency Control),即多版本并发控制,是并发读写场景下,数据库层面提供的一种解决方案。读读当多个事务同时进行读取操作时,它们之间不存在资源竞争,不会产生任何问题。因为读取操作并不会对数据进行修改。读写在这种场景下,一个事务进行读取操作,另一个事务进行写入操作,可能会引发一系列数据一致性问题,如脏读(读取到其他事务未提交的数据)、不可重复读(在同一事务中多次读取同一数据结果不同)以及幻读(事务执行过程中出现新的符合条件的数据)。

weixin_45593273的博客 3341

一次点击跑通:用 Postman 自动获取并携带 CSRF token,测试 SAP OData 写操作

SAP OData 写操作自动化测试方案 针对 SAP Gateway OData 服务写操作中常见的 CSRF token 验证问题,本文提出了一套基于 Postman 的自动化解决方案: 问题分析:解释了 CSRF token 的验证机制及其必要性,说明手工测试效率低下的原因 解决方案: 使用 Postman 环境变量存储 token 通过脚本自动获取并传递 token 利用 Collection Runner 实现一键执行 实施步骤: 创建环境变量存储 token 第一个请求获取 token 并存入变

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 301

InnoDB MVCC RR隔离级别下的数据可见性总结

一、背景 熟悉数据库隔离级别的人都知道,在RR(可重复读)隔离级别下,无论何时多次执行相同的SELECT快照读语句,得到的结果集都是完全一样的,即便两次SELECT语句执行期间,其他事务已经改变了该查询结果并已经提交。 对于这一机制的实现原理,网上常见的一种解释如下: ####MVCC在MySQL的InnoDB中的实现 在InnoDB中,会在每行数据后添加两个额外的隐藏的值来实现MVCC,...

孔子说 719

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

insert时实现某一字段自增_史上最详尽,一文讲透 MVCC 实现原理

1. 引言上一篇文章中,我们介绍了 mysql 的 crash safe 机制,也是 ACID 中原子性的实现— redolog 的原理和配置方法。mysql异常情况下的事务安全—详解mysqlredolog本文,我们来介绍 mysql 在可重复读隔离级别下事务的实现方式— MVCC,以及他的实现原理— undolog。2. undologundo log 是 MVCC...

weixin_39603995的博客 604

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

5.5 MVCC原理

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种不用加锁就能实现事务隔离的并发控制机制。写操作不直接覆盖旧数据,而是生成一个新版本;读操作根据事务的隔离级别和时间戳,选择合适的版本来读。这样一来,读操作永远不用等待写操作,写操作也不用等待读操作,读写互不阻塞。生活类比:你在写一份文档,每隔一段时间保存一个历史版本。别人想读的时候,可以选择读最新版,也可以选择读某个历史版。你写你的,他读他的,互不干扰。重要前提:InnoDB 的 MVCC仅在(RC)和。

qq_39275653的博客 257

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

深入理解MySQL中事务隔离级别的实现原理

深入理解MySQL中事务隔离级别的实现原理前言定义标准SQL隔离级别实现原理标准SQL事务隔离级别实现原理InnoDB事务隔离级别实现原理1、锁定读和一致性非锁定读2、当前读和快照读3、隐式锁定和显式锁定一些常见误区 前言 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。 今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文

shen_shi_wei的博客 624

MVCC文章勘误

标签: 「我们都是小青蛙」公众号文章 前几天在文章 MySQL事务隔离级别和MVCC 中阐述了InnoDB的MVCC的工作原理,但是在一个地方出现了错误,特此更正一下。 原文错误的地方: 在事务生成readview时,会把当前系统中正在执行的读写事务写入到m_ids列表中,在判断某条记录可见性时,之前文章中写的是当记录的trx_id属性大于m_ids中的最大值时,该记录是不可见的。 应该更正为: ...

weixin_33982670的博客 155

大厂面试必问:SQL执行原理与InnoDB核心机制解析

SQL执行原理是数据库性能优化的基础,涉及查询优化器、执行引擎等核心组件。通过理解执行计划生成机制,开发者能有效解决索引失效、慢查询等典型性能问题。InnoDB存储引擎的MVCC实现和锁机制是保证事务隔离性的关键技术,尤其在分布式架构和云原生数据库场景下更为重要。掌握这些原理不仅能应对大厂面试,更能帮助优化电商促销等高并发场景的数据库性能,如通过调整联合索引将查询响应时间从12秒降至200毫秒。

weixin_34116110的博客 910

MySQL ACID原理深度解析:从undo log、redo log到MVCC与隔离级别

数据库事务的ACID特性是保障数据一致性的基石,但其实现机制常被忽视。本文从原子性、一致性、隔离性、持久性的内在关系出发,深入剖析InnoDB引擎中undo log与redo log的工作原理,以及锁、MVCC和隔离级别如何协同解决脏读、不可重复读、幻读等并发问题。同时结合Spring事务注解与常见失效场景,揭示事务机制在工程实践中的价值。对于排查线上数据异常、理解MySQL高性能读写背后的设计思想,以及应对面试中的高频问题,都能提供扎实的参考路径。

weixin_32932149的博客 206

MySQL 高性能核心:MVCC 无锁并发机制解析

本文深入解析InnoDB的MVCC(多版本并发控制)机制:通过隐藏字段、Undo Log版本链与Read View可见性规则,实现无锁快照读,兼顾高并发与事务隔离。详解RC/RR级别差异、快照读vs当前读,并提醒Undo日志膨胀等实战坑点。

「一个在数据库赛道上边学边分享的学妹」——聚焦国产数据库/信创方向、分享学习笔记、踩坑经验和行业观察。 507

阿里面试官必问:MySQL主流存储引擎有哪些?InnoDB与MyISAM核心区别90%求职者答不全!

MySQL存储引擎是后端面试经典高频考题,几乎每场MySQL面试都会出现。InnoDB支持事务,MyISAM不支持。一旦面试官继续深挖:MVCC、锁机制、索引结构、崩溃恢复、外键、并发性能、文件组成、业务选型,大量人开始混乱。MySQL支持多款存储引擎,不只有InnoDB、MyISAM。本文梳理主流存储引擎,重点对比最常用的InnoDB与MyISAM,附带底层原理、优缺点、适用场景、面试避坑点,看完面试直接满分。MySQL采用插件式存储引擎架构。SQL解析、优化器属于MySQL Server层;

程序员夏洛的博客 327

mysql 并没有幻读_别再误解MySQL和「幻读」了

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the seco...

weixin_39696197的博客 773

Mysql架构&事务原理与锁机制&MVCC日志(undo log redolog binlog)两阶段提交&组提交

想要进一线互联网大厂公式,MYSQL是绕不开的坎,对于MYSQL的事务隔离机制以及日志相关知识网上众说纷纭,你抄我我抄你,今天我要详细总结一下相关知识,形成完整体系,补充一句,下面所讲全是干货,废话就不多说了,直接讲解知识,欢迎留言评论,不足纠正! 下文主要针对MYSQL的innodb存储引擎。 mysql的架构 首先,我们从架构开始说起。mysql分为server层与存储引擎层,server层包含连接器、分析器、优化器、执行器。 接下来以一条sql查询语句执行过程介绍各个部分功能。 客户端执行一条sql:

小龙coding的博客鸭~ 742

MySQL底层原理与架构:从SQL执行到InnoDB存储的完整链路解析

在数据库系统设计中,MySQL作为主流关系型数据库,其底层架构由连接层、Server层与存储引擎层协同构成。理解一条SQL如何经过分析器、优化器、执行器最终落盘,是排查慢查询与性能瓶颈的基础。InnoDB存储引擎通过B+树索引组织数据,利用聚簇索引与二级索引减少回表开销,借助redo log与undo log保障事务的持久性与原子性,并基于MVCC多版本并发控制实现可重复读隔离级别。同时,Buffer Pool内存管理机制及改进型LRU算法有效提升缓存命中率,而change buffer与刷盘策略进一步优化

weixin_29248653的博客 211

MySQL面试核心知识点与优化实战解析

关系型数据库作为数据存储的核心组件,其索引机制与事务原理是数据库优化的基础。B+树索引通过多路平衡结构实现O(log n)查询效率,配合缓冲池机制显著降低磁盘IO。事务的ACID特性依托undo log实现原子性、redo log保证持久性,MVCC机制则在并发控制中发挥关键作用。在电商、金融等高频交易场景中,合理的索引设计与锁粒度控制能有效提升系统吞吐量。本文以MySQL为例,深入解析InnoDB存储引擎的架构设计,详解Next-Key Lock如何解决幻读问题,并提供慢查询优化三板斧等工程实践方案,帮助

weixin_34268579的博客 334
上一篇: select、poll、epoll之间的区别总结
下一篇: 区块链在物联网中的应用
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值